如何实施以下内容: *找到data3的值,其中id =“ID1”和region =“RegionA”和indicator_id“= 1 *(结果应该是:”A“)
元素集合:
{
"id" : "ID1",
"data1" :
[
{
"region" : "RegionA",
"data2" : [
{
"indicator_id" : 1,
"data3" : "A"
},
{
"indicator_id" : 2,
"data3" : "B"
},
{
"indicator_id" : 3,
"data3" : "C"
},
{
"indicator_id" : 4,
"data3" : "D"
}
]
},
{
"region" : "RegionB",
"data2" : [
{
"indicator_id" : 5,
"data3" : "A"
},
{
"indicator_id" : 6,
"data3" : "B"
},
{
"indicator_id" : 7,
"data3" : "C"
},
{
"indicator_id" : 8,
"data" : "D"
}
]
}
]
}
不要使用$ where,因为它效率低下
以下作品但返回整个'RegionA'(这不是预期的结果)并使用'[0] .data1 [0] .data2 [0] .data3'来投影“A”:
db.elements.find({id:"ID1"},{data1 : { $elemMatch: { data2: {$elemMatch: { indicator_id:1}}}}})[0].data1[0].data2[0].data3
答案 0 :(得分:0)
您好,您可以尝试以下
db.test1.find({id:"ID1",data1:{$elemMatch: { region:"RegionA"}}, "data1.data2.indicator_id":1 })
希望这就是你要找的东西。
答案 1 :(得分:0)
首先,你说得对,说数据模型可能不正确。 看起来你正试图保持SQL像表,只是嵌入关系作为子文档。 问题是您正在尝试深入查询这些子文档。 您需要的是将'$ elemMatch'运算符应用于子文档,但不支持此操作。 见https://jira.mongodb.org/browse/SERVER-831 即使它得到支持,查询也会过于复杂,而且您很难在这些数据上声明索引。
作为当前查询的替代方法,您可以使用聚合框架。
db.elements.aggregate([{"$match":{"id":"ID1"}},{"$unwind":"$data1"},{"$unwind":"$data1.data2"},{"$match":{"data1.region":"RegionA","data1.data2.indicator_id":1}},{"$project":{"answer":"$data1.data2.data3","_id":0}}]).result
[ { "answer" : "A" } ]
即使上述聚合查询有效并且可能适用于少量数据,我建议您查看需要执行的查询并相应地对数据建模。
例如,如果以上是您最重要的查询,您可能需要考虑为每个'data3'项目设置一个文档。在上面的聚合查询中运行2 $ unwind命令后,您的数据看起来就像您看到的文档:
{
"_id" : ObjectId("52caeb934c735353309cf068"),
"id" : "ID1",
"region" : "RegionA",
"indicator_id" : 1,
"data3" : "A"
},
{
"_id" : ObjectId("52caeb934c735353309cf068"),
"id" : "ID1",
"region" : "RegionA",
"indicator_id" : 2,
"data3" : "B"
},
...
要了解有关建模的更多信息,请观看MongoDB的演示文稿。 转到http://www.mongodb.com并搜索“演示数据建模”