mongo db вложенный запрос с подстановочными знаками и условием равенства - PullRequest
0 голосов
/ 23 апреля 2019

Попытка выполнить запрос поиска mongo db с условием равенства в значении вложенного ключа VARIABLE

Бонусные баллы за решение pymongo

db.utestmongo.insert({'name':'test','doc':{'heading':{'title':'awesome'},'body':{'title':'content'}}})
# want: 'title'=='awesome' => {'name':'test','doc':{'heading':{'title':'awesome'},'body':{'title':'content'}}}
# ideally
db.utestmongo.find( { "doc.*.title": "awesome" } )

# tried
db.utestmongo.find( { doc: { $elemMatch: { title: 'awesome' } } } )

Также пробовали ссылки ниже, очень запутался, может быть, потому что это не запрос на равенство https://jira.mongodb.org/browse/SERVER-2989
https://docs.mongodb.com/manual/tutorial/query-embedded-documents/
Вложенный запрос монго
Вложенный запрос Монго с ключами

1 Ответ

1 голос
/ 23 апреля 2019

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

Другой альтернативой является использование агрегата с objectToArray , а затем перебор всех ключей.это должно выглядеть так:

 db.utestmongo.aggregate([
    {
      $addFields: { array: { $objectToArray: "$doc" }}
    },   
    {
      $match: {'array.v.title': "awesome"}
    }])

решение pymongo

import pymongo
db_cnxn = pymongo.MongoClient()
db = db_cnxn['db']

pipeline = [
        {"$addFields":{"array": { "$objectToArray": "$doc" }}},
        {"$match": {'array.v.title': "awesome"}}
        ]

list(db['utestmongo'].aggregate(pipeline))
...