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']
guilin 桂林
fonte

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
Jeff o urso
fonte
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.

heinob
fonte
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