MongoDB通过***属性和嵌套数组键查找文档,并返回匹配文档的一部分

Posted

技术标签:

【中文标题】MongoDB通过***属性和嵌套数组键查找文档,并返回匹配文档的一部分【英文标题】:MongDB find document by top-level property and nested array key, and return part of the matched document 【发布时间】:2021-09-24 10:31:24 【问题描述】:

我是 MongoDB 的新手。我在 MongoDB 集合中有以下 JSON 文档。


    name: "Alice",
    orders: 
        1: 
            items: [11,22,33,…],
            delivery: [
                
                    from: area1
                    to: area2
                ,
                
                    from: area2
                    to: area3
                ,
                ⋮
            ],
            areas: 
                area1: 
                   address: "area1 address"
                   contacts: [1,2,3,…] 
                ,
                area2: 
                    address: "area2 address"
                    contacts: [4,2,8,…] 
                ,
                ⋮
            
                    
        2:  … ,
        3:  … ,
        4:  … ,
        5:  … 
        ⋮
    
​
​⋮    

我想通过orders中的key搜索具有特定name和特定顺序的文档,并返回包含匹配顺序的匹配文档的子部分。

例如,对于名称 Alice 和订单 1,我想检索:


    name: "Alice",
    orders: 
        1: 
            items: [11,22,33,…],
            delivery: [
                
                    from: area1
                    to: area2
                ,
                
                    from: area2
                    to: area3
                ,
                ⋮
            ],
            areas: 
                area1: 
                   address: "area1 address"
                   contacts: [1,2,3,…] 
                ,
                area2: 
                    address: "area2 address"
                    contacts: [4,2,8,…] 
                ,
                ⋮
            
        
    
​

我正在使用 PyMongo,我该如何实现?

【问题讨论】:

到目前为止你尝试了什么? 我可以通过这种方式检索完整记录:db.find_one('name': 'Alice'),但无法通过 Key 获取订单,不知道如何排除与 Key 不匹配的其他记录。 【参考方案1】:

我对 PyMongo 不是很熟悉,但是 AFAIK 你可以通过将第二个参数作为projection 传递给find_one 来过滤你的结果,“应该在结果集中返回的字段名称列表或dict 指定要包含或排除的字段”see the docs on find, which also apply to find_one。在投影中,您可以通过将 01 作为值传递来“打开/关闭”各个字段以返回,所以我会尝试这样的事情:

db.find_one('name': 'Alice', 
            'orders': 1: 1
            )

【讨论】:

谢谢@fsimonjetz。这可行,但是,它只返回order JSON,它是一个子文档,而不是主文档属性。例如,它不会以 JSON 格式返回 name。我想用搜索到的order 获取主文档。你的建议输出是"orders":"2":…,我想要的是"name":"Alice","orders":'2':…,如果能得到"name":"Alice","orders":…就更好了 它只返回order JSON,因为这是在第二个参数中定义的。如果您也需要名称,请将函数调用中的 'orders':1: 1 更改为 'name':1, 'orders': 1: 1 - 但如果您需要整个条目,db.find_one('name': 'Alice') 应该可以,不是吗? 或者是在检索条目后从条目中提取数据的问题?由于条目是 JSON,我假设您可以通过索引获取子元素,例如,match = db.find_one('name': 'Alice'); print(match['orders'][1])——这行得通吗? 是的,做到了。谢谢。

以上是关于MongoDB通过***属性和嵌套数组键查找文档,并返回匹配文档的一部分的主要内容,如果未能解决你的问题,请参考以下文章

通过 Mongoose、Node.js、MongodB 中的特定属性查找嵌入式文档

当嵌套字典键发生变化时,如何使用嵌套字典查询 mongodb 文档?

根据对象数组中不匹配的属性查找匹配的文档 - MongoDB

通过键字段查找 MongoDB 集合中的所有重复文档

MongoDB $and 仅当 $and 在文档的同一数组索引中为真时才查询 - 特别是对于双重嵌套数组 [重复]

如何在 MongoDB 中推入具有精确键值的对象嵌套数组?