¿Cómo verificar si un campo de matriz contiene un valor único u otra matriz en MongoDB?

143

Estoy usando mongodb ahora.

Tengo una colección de blogpost, y blogpost tiene una etiqueta archivada que es una matriz, por ejemplo

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

¿Cómo puedo hacer estas búsquedas?

  1. contiene 'etiqueta1'
  2. contiene ['etiqueta1', 'etiqueta2'],
  3. contiene cualquiera de ['tag3', 'tag4']
guilin 桂林
fuente

Respuestas:

219

Probar esto:

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3
Jeff el oso
fuente
66
Esto está bien documentado en la ayuda: mongodb.org/display/DOCS/…
Scott Hernandez
2
para $ all, ¿significa todos los elementos Y en el orden expresado o simplemente no está ordenado?
redben
2
@ScottHernandez No veo que mencionen que el campo que está utilizando como búsqueda puede ser una matriz, y cómo se maneja. "campo: {$ in: array}". ¿Qué sucede cuando busca una matriz dentro de una matriz de matrices? No especificado.
Zut
¿Hay algún INDICE que podamos hacer en la matriz para detener la duplicación? En caso afirmativo, guíe cómo.
Hitesh Joshi
1
@redben está desordenado como está escrito en los documentos: $ todos los operadores DOCS . Simplemente lea la parte del ejemplo y verá.
Matthias B
5

Mi experiencia es que para (2) la siguiente solución es mucho más rápida que la que tiene "$ all":

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

pero para ser sincero, no sé por qué. Me interesaría, si alguien lo sabe.

heinob
fuente
1
Por cierto, solo lo probé en la lista de palabras clave indexadas. Absolutamente el mismo resultado con $ y $ todos
isox
Tal vez eso cambió con versiones más recientes mientras tanto.
heinob
Es circunstancial Para "$ y", mongodb hace una operación lógica "y". Por lo tanto, si la primera expresión es falsa, la segunda no se tiene en cuenta. Esto significa menos procesamiento.
kubudi
Pero eso debería suceder con '$ all' también, ¿no?
heinob
1
$ all es probablemente dos búsquedas en un índice, $ y es probablemente una búsqueda con un análisis secuencial del resultado.
Evan Carroll