¿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.