【问题标题】:mongo db nested query with wildcards and equality condition带有通配符和相等条件的mongodb嵌套查询
【发布时间】:2019-04-26 02:17:34
【问题描述】:

尝试在嵌套的 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

【问题讨论】:

标签: mongodb pymongo


【解决方案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))

【讨论】:

  • 不错!是否可以让它只返回{'title':'awesome'} 部分?
  • 是的,当然,你能澄清一下你想要返回的内容吗?只是标题部分似乎没有意义,因为你已经知道匹配的标题。
  • {'title':'awesome', 'more':'stuff'} 基本上是与过滤器值关联的最接近的数据。你也可以批准我的编辑你在解决方案中有错字
  • 添加一个$project 阶段,只包含您想要的字段。
猜你喜欢
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多