我在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)
输出始终为“无”。
关于如何进行正确查询的任何想法?
谢谢!
答案 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
}
}
}
])