Come verificare se un campo di array contiene un valore univoco o un altro array in MongoDB?


143

Sto usando mongodb ora.

Ho una raccolta blogpost e blogpost ha un tag archiviato che è un array, ad es

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

Come posso fare queste ricerche

  1. contiene 'tag1'
  2. contiene ['tag1', 'tag2'],
  3. contiene uno qualsiasi di ['tag3', 'tag4']

Risposte:


219

Prova questo:

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3

6
Questo è ben documentato nella guida: mongodb.org/display/DOCS/…
Scott Hernandez

2
per $ all significa tutti gli elementi E nell'ordine espresso o è solo non ordinato?
Redben,

2
@ScottHernandez Non vedo che menzionino che il campo che stai utilizzando come ricerca può essere un array e come viene gestito. "field: {$ in: array}". Cosa succede quando si cerca un array all'interno di un array di array? Non specificato.
Zut,

C'è qualche INDICE che possiamo fare sugli array per fermare i duplicati? Se sì, ti preghiamo di guidare come.
Hitesh Joshi,

1
@redben non è ordinato come scritto nei documenti: $ tutti i DOCS dell'operatore . Leggi la parte di esempio e vedrai.
Matthias B,

5

La mia esperienza è che per (2) la seguente soluzione è molto più veloce di quella con "$ all":

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

ma ad essere sincero, non so perché. Sarei interessato, se qualcuno lo sapesse.


1
A proposito, l'ho appena testato nell'elenco delle parole chiave indicizzate. Assolutamente lo stesso risultato con $
ee

Forse nel frattempo è cambiato con le versioni più recenti.
heinob,

È circostanziale. Per "$ e", mongodb effettua un'operazione "e" logica. Pertanto, se la prima espressione è falsa, la seconda non viene presa in considerazione. Questo significa meno elaborazione.
Kubudi,

Ma ciò dovrebbe accadere anche con '$ all', no?
heinob,

1
$ all è probabilmente due ricerche su un indice, $ ed è probabilmente una ricerca con una scansione sequenziale del risultato.
Evan Carroll,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.