Como verificar se um campo da matriz contém um valor exclusivo ou outra matriz no MongoDB?


143

Estou usando o mongodb agora.

Eu tenho uma coleção de posts do blog, e o blogpost possui tags arquivadas que são uma matriz, por exemplo

blogpost1.tags = ['tag1', 'tag2', 'tag3', 'tag4', 'tag5']
blogpost2.tags = ['tag2', 'tag3']
blogpost3.tags = ['tag2', 'tag3', 'tag4', 'tag5']
blogpost4.tags = ['tag1', 'tag4', 'tag5']

Como posso fazer essas pesquisas

  1. contém 'tag1'
  2. contém ['tag1', 'tag2'],
  3. contém qualquer um dos ['tag3', 'tag4']

Respostas:


219

Experimente o seguinte:

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3

6
Isso está bem documentado na ajuda: mongodb.org/display/DOCS/…
Scott Hernandez

2
para $ all significa todos os elementos AND na ordem expressa ou é apenas desordenado?
redben

2
@ScottHernandez Não vejo que eles mencionem que o campo que você está usando como pesquisa pode ser uma matriz e como isso é tratado. "campo: {$ in: array}". O que acontece quando você procura uma matriz em uma matriz de matrizes? Não especificado.
Zut

Existe algum INDEXING que podemos fazer no array para parar de duplicar? Se sim, por favor, guie como.
Hitesh Joshi

1
@redben é desordenado, como está escrito nos documentos: $ all DOCS operator . Basta ler a parte do exemplo e você verá.
Matthias B

5

Minha experiência é que, para (2) a solução a seguir é muito mais rápida que a com "$ all":

db.blogpost.find({ $and: [ {tags: 'tag1'} ,{tags: 'tag2'} ] });

mas, para ser sincero, não sei por quê. Eu estaria interessado, se alguém souber.


1
A propósito, apenas testei na lista de palavras-chave indexadas. Absolutamente o mesmo resultado com $ ee $ all
isox

Talvez isso tenha mudado com as versões mais recentes.
91313 heinob

É circunstancial. Para o "$ and", o mongodb faz uma operação lógica "e". Portanto, se a primeira expressão for falsa, a segunda não será levada em consideração. Isso significa menos processamento.
Kubudi

Mas isso deveria acontecer com '$ all' também, não deveria !?
heinob

1
$ all provavelmente são duas pesquisas em um índice, $ e provavelmente uma pesquisa com uma varredura seqüencial no resultado.
Evan Carroll
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.