Справка по запросу MongoDB: $ elemMatch во вложенных объектах - PullRequest
14 голосов
/ 20 апреля 2011
> 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.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 21 апреля 2011

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

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

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

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

Звучит так, будто вы хотите найти "все в объекте 'c' для экземпляра 'e1'" .

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

  • Достигнуть объектов , точечная запись: db.test.find({'a.b.c.d1' : 'e1'})
  • Прочитать массивы : `db.test.find ({'a.b.c.d4': 'e5'})

Звучит так, будто вы ищете возможность сделать оба одновременно. Вы хотите «добраться до объектов» и «прочитать массивы» в одном запросе.

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

2 голосов
/ 27 июня 2011

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

Я считаю, что ты ищешь запрос

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...