我尝试学习MongoDB,我似乎无法弄清楚如何做到这一点。
假设我有三个这样的对象:
{
"_id": 99990,
"type" : 15,
"attributes": [
{
"id": 1,
"value": 115
}
]
},
{
"_id": 99991,
"type" : 5,
"attributes": [
{
"id": 1,
"value": 120
}
]
},
{
"_id": 99992,
"type" : 5,
"attributes": [
{
"id": 1,
"value": 120
}
]
},
{
"_id": 99993,
"type" : 5,
"attributes": [
{
"id": 1,
"value": 150
}
]
},
如何根据属性“id”1搜索项目并仅返回id为99993,值为150?我今天刚开始玩MongoDB,所以这可能是一个非常基本的问题。
要添加挑战,我如何通过attributes / id / value对类型5的每个项目的结果进行分组,并获得如下结果:
"id" : 1, "value" : 150, "count" : 1
"id" : 1, "value" : 120: "count" : 2
这只是示例数据,架构非常复杂,但就本练习而言,它应该足够了。
答案 0 :(得分:5)
对于第一部分,您应该能够通过执行以下操作来检索该记录:
db.collectionName.find({"attributes.id": 1, "attributes.value": 150});
这将从任何具有属性数组元素的对象中检索_id字段,该元素具有id = 1和value = 150。
由于问题的第二部分涉及返回匹配计数,因此您应该使用map-reduce探索您的选项。您无法使用简单的Mongo查询生成该结果。
答案 1 :(得分:0)
由于“属性”是对象数组,因此应在查询中使用“ $ elemMatch”。
db.collectionName.find(
{
"attributes" : {
$elemMatch : {
"id" : 1,
"value": 150
}
}
}
);
如果我们使用建议的查询@clexmond,还将返回下面提到的示例文档,这是不正确的。
{
"_id": 99999,
"type" : 5,
"attributes": [
{
"id": 1,
"value": 170
},
{
"id": 2,
"value": 150
}
]
}
问题的第二部分,即使我也不知道。我希望看到答案。如果有的话请分享。