¿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']

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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.