查询嵌套的第3级

时间:2018-08-29 14:07:20

标签: python python-3.x mongodb pymongo

我在MongoDB中有一个数据库,该数据库具有3个级别,我想从最后一个级别获取值。结构如下:

{
    "_id" : "10000",
    "Values" : [
        {
            "Value1" : "Article 1",
            "Value2" : [
                {
                    "Value2_1" : 1,
                    "Value2_2" : 2,
                }
            ]
        }
    ]
}

我需要从标签“ Value2_1”中获取值。

到目前为止,我的代码如下:

for row in collection.find({"_id":1, "Values.Value2.Value2_1":1})
     print(row)

输出始终为“无”。

关于如何进行正确查询的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:0)

通过使用点(.)表示法,您可以获得预期的结果。

db.collection.find({"Values.Value2.Value2_1" : 100})

上面的查询将选择Values数组具有Values2数组和Values2具有Values2_1且值等于100的所有文档

  

输出:

{
    "_id" : ObjectId("5b86bd1172876096c7a9d6cf"),
    "Values" : [ 
        {
            "Value1" : "Article 1",
            "Value2" : [ 
                {
                    "Value2_1" : 100.0,
                    "Value2_2" : 200.0
                }, 
                {
                    "Value2_1" : 15.0,
                    "Value2_2" : 25.0
                }
            ]
        }
    ]
}
  

如果您尝试使用_id进行搜索,则无需使用   第二个条件是因为根据定义_id始终是唯一的。

以下查询也将显示与上面相同的结果。

db.collection.find({"_id" : ObjectId("5b86bd1172876096c7a9d6cf")})

答案 1 :(得分:0)

如果只想从内部数组中获得满足内部条件的那些项,则可以汇总查询 PS-我的2美分-我不知道您是否需要这个,因为我无法从您的问题中得到明确的答案,我只是以为您可能会问这个。

db.coll.aggregate([{
            $unwind: '$Values'
        }, {
            $project: {
                'Values_F': {
                    $filter: {
                        input: "$Values.Value2",
                        as: "value2",
                        cond: {
                            $eq: ["$$value2.Value2_1", 1]
                        }
                    }
                }
            }
        }, {
            $project: {
                'Values_F': 1,
                'total': {
                    $size: '$Values_F'
                }
            }
        }, {
            $match: {
                total: {
                    $gte: 1
                }
            }
        }
    ])