Подтвердить что ты не робот

Справка по запросу MongoDB: $elemMatch во вложенных объектах

> 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" ] } } } }

Но ни одна из этих работ не работает:

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

Предположим, что я не знаю, что такое значения c и d1... d4. Существует ли общий способ поиска структуры вложенных объектов для определенных значений?

Я подумал, что для этого был $elemMatch.

Спасибо.

4b9b3361

Ответ 1

Я думал, что это то, что $elemMatch было для...

Из docs: Используя оператор запроса $elemMatch, вы можете сопоставить весь документ внутри массива.

Это не похоже на то, что вы ищете.

Существует ли общий способ поиска структуры вложенных объектов для определенных значений?

Похоже, вы хотите искать "все в объекте" c "для экземпляра" e1 ".

MongoDB поддерживает две связанные функции, но функции не совсем то, что вы ищете.

  • Достижение объектов, точка нотации: db.test.find({'a.b.c.d1' : 'e1'})
  • Чтение массивов: `db.test.find({'a.b.c.d4': 'e5'})

Похоже, вы ищете возможность делать одновременно. Вы хотите "попасть в объекты" и "прочитать массивы" в том же запросе.

К сожалению, я не знаю такой возможности. Вы можете захотеть просмотреть файл-запрос для этого.

Ответ 2

Trope, вы когда-нибудь находили ответ на свой вопрос?

Я считаю, что запрос, который вы ищете,

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

К твоему кредиту, ты был очень близок!

В любом случае, надеюсь, что это поможет!