2017-06-12 12 views
2

Ich habe etwa 200.000 Dokumente in einer MongoDB Sammlung und ich brauche nur die Dokumente, die spezifische Inhalte hat.Suche nach String oder Nummer im Feld

Zum Beispiel

{ 
    "_id": ObjectID("593ddb4f02a8b0e23446ad65"), 
    "instance_id": "166143", 
    "json": { 
    "o": { 
     "2": [9] 
    } 
    } 
} 

ich Dokumente erhalten möchten, die 9 in json.o.2 haben aber das Problem ist, kann json.o.2 ein Objekt sein, es kann auch eine Zeichenfolge sein & eine ganze Zahl zum Beispiel ich möchte all diese hier bekommen

"2": [9] 
... 
"2": 9 
... 
"2": "9" 
... 
"2": ["9"] 

ich versuchte Regex zu verwenden, aber es hat nicht funktioniert

'json.o.2': { '$regex': /^(\[?)(.*)(,?)("?)9("?)(,?)(.*)(\]?)$/i } 

Ich muss auch alle Dokumente, die ich Regex keine bestimmte Zahl enthalten, verwenden Sie auch für diesen Fall aber auch nicht mit $in für beide

'json.o.2': { '$regex': /^([?)([^3]*)(,?)("?)([^3]*)("?)(,?)([^3]*)(]?)$/i } 

Antwort

2

Dann schauen arbeiten:

db.collection.find({ "json.o.2": { "$in": ["9",9] } }) 

$in der Operator ist im Grunde eine abgekürzte Form von $or

db.collection.find({ "$or": [{ "json.o.2": "9" }, { "json.o.2": 9 } ]) 

der allgemeine Fall ist, dass „entweder“ Wert tatsächlich s für und für Sie, da Sie eine genaue Übereinstimmung Bedingung haben, dann ist das völlig in Ordnung. MongoDB ist es auch egal, ob der Pfad ein einfacher Wert oder ein Array ist.

1

können Sie dies ohne Regex aber mit dem $or Operator leicht erreichen.

Diese Abfrage die Arbeit tun sollten:

db.collection.find({$or: [{"json.o.2": 9}, {"json.o.2": "9"}]})