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.