具有通配符和相等条件的mongo db嵌套查询

时间:2019-04-22 21:18:16

标签: mongodb pymongo

尝试在嵌套的VARIABLE键值中运行具有相等条件的mongo db find查询

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/
Nested mongo query
Mongo nested query with keys

1 个答案:

答案 0 :(得分:1)

如果希望将其保留为查找查询,则需要使用where子句并为其提供功能,但是我不确定这种方法的效率如何。

另一种选择是将聚合与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))