15 Stimmen

Hilfe zur MongoDB-Abfrage: $elemMatch in verschachtelten Objekten

> db.test.insert({"a" : { "b" : { "c" : { "d1" : [ "e1" ],
                                          "d2" : [ "e2" ], 
                                          "d3" : [ "e3", "e4" ], 
                                          "d4" : [ "e5", "e6" ] } } } })
> db.test.find({'a.b.c' : {$exists : true}})
{ "_id" : ObjectId("4daf2ccd697ebaacb10976ec"), "a" : { "b" : { "c" : { "d1" : [ "e1" ], "d2" : [ "e2" ], "d3" : [ "e3", "e4" ], "d4" : [ "e5", "e6" ] } } } }

Aber keine dieser Maßnahmen funktioniert:

> db.test.find({'a.b': "c"})
> db.test.find({'a.b': {$elemMatch : {"c" : {$exists: true}}}})
> db.test.find({'a.b': {$elemMatch : {$elemMatch : {$all : ["e1"] }}}})

Angenommen, ich weiß nicht, was die Werte von c y d1 ... d4 sind. Gibt es eine generische Möglichkeit, die Struktur der verschachtelten Objekte nach bestimmten Werten zu durchsuchen?

Ich dachte, das wäre es, was $elemMatch war für.

Ich danke Ihnen.

7voto

Gates VP Punkte 44457

Ich dachte, dafür sei $elemMatch gedacht...

Von die Dokumente : Mit dem Abfrageoperator $elemMatch können Sie ein ganzes Dokument innerhalb eines Arrays abgleichen.

Das klingt nicht nach dem, wonach Sie suchen.

Gibt es eine generische Möglichkeit, die Struktur der verschachtelten Objekte nach bestimmten Werten zu durchsuchen?

Es klingt, als ob Sie Folgendes suchen wollen "alles in Objekt 'c' für eine Instanz von 'e1'" .

MongoDB unterstützt zwei verwandte Funktionen, aber die Funktionen sind nicht ganz das, was Sie suchen.

  • In Objekte greifen , Punktnotation: db.test.find({'a.b.c.d1' : 'e1'})
  • Arrays durchlesen : `db.test.find({'a.b.c.d4' : 'e5'})

Es klingt, als ob Sie beides gleichzeitig machen wollen. Sie möchten in der gleichen Abfrage "auf Objekte zugreifen" und "durch Arrays lesen".

Leider ist mir eine solche Funktion nicht bekannt. Vielleicht möchten Sie eine Funktionsanfrage stellen für diese.

2voto

Matt Diamond Punkte 11636

Ich glaube, die Abfrage, die Sie suchen, lautet

db.test.find({ 'a.b.c': { '$exists': true } });

Zu Ihrer Ehre, Sie waren sehr nah dran!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X