我使用聚合功能来获取具有特定条件的数组。因此聚合遍历集合中的所有文档,然后遍历文档中的所有宠物数组,最后遍历嵌套在宠物数组中的所有处理数组。
db.collection.aggregate({$unwind:"$pets"},{$group:{"_id":"$pets.treatments"}},
{$unwind:"$_id"},{$group:{"_id":"$_id"}},{$match:
{"_id.name":"name"}}
结果我得到这样的话:
[{"_id":
{"name":"vet","treatment":"misoshiur","paid":"NO","opinion":"Good"}},
{"_id":{"name":"vet","treatment":"czekolada","paid":"NO","opinion":""}},
{"_id":
{"name":"vet","treatment":"misoshiur","paid":"NO","opinion":"Excellent"}},etc...]
我的问题是,我可能会有两个或更多相同的对象。
{"_id":
{"name":"vet","treatment":"misoshiur","paid":"NO","opinion":"Excellent"}}
{"_id":
{"name":"vet","treatment":"misoshiur","paid":"NO","opinion":"Excellent"}}
然后当我在mongodb中执行我的命令并且我有两个完全相同的对象时,它不会返回它们,它只返回一个,为什么会这样?以及如何让它返回所有对象?即使这些对象完全相同?
其实我对mognodb的体验不是很好,即使查询不是那么完美,它也能解释我的要求;)但有人可以解释一下为什么mongodb在使用$ match之后,拒绝它已经拥有的对象阵列?我的项目很重要,因为我在计算意见,而且可能会被某人复制。
JSON
[{
"_id" : ObjectId("550361c38323c1f65dae65c3"),
"username" : "pet",
"password" : "pet",
"character" : "pet",
"pets" : [
{
"name" : "cat",
"kind" : "micoc",
"age" : "2",
"treatments" : [
{
"name" : "vet",
"treatment" : "czekolada",
"paid" : "NO",
"opinion" : "Good"
}
]
},
{
"name" : "io",
"kind" : "dog",
"age" : "5",
"treatments" : [
{
"name" : "vet",
"treatment" : "misoshiur",
"paid" : "NO",
"opinion" : "Excellent"
}
]
}
]
}]
我的目标是创建一个数组,它将包含来自所有文档嵌套处理数组的所有对象。所以每个文档都有宠物数组,宠物数组中的每个对象都有治疗数组。我想在所有文档中使用所有这些处理数组,并使用$ match指定名称。因此,我得到的数组包含所有文档中所有处理数组的对象,其名称键等于某个用户。
答案 0 :(得分:3)
因为我不确定你是什么意思"使用$ match指定名称"因为宠物阵列也有" name"和治疗阵列也有" name"。我原以为你想在#34; pets.name"并获得阵列中的所有治疗。 因为,宠物是一个阵列首先放松他们然后放松治疗,因为它也是一个阵列,然后匹配' pets.name'然后通过' pets.name'进行分组。并推动治疗阵列。
aggregate([
{
$unwind: "$pets"
},
{
$match: {
"pets.name": "io"
}
},
{
$unwind: "$pets.treatments"
},
{
$group: {
_id: "$pets.name",
treatments: {
$push: "$pets.treatments"
}
}
}
])
输出将是这样的。
{
"_id": "io",
"treatments": [
{
"name": "vet",
"treatment": "misoshiur",
"paid": "NO",
"opinion": "Excellent"
}
]
}
如果你想在pets.treatment.name上匹配$匹配,请将$ match替换为" $ pets.treatments.name"和_id in $ group with" $ pets.treatments.name"。 Writing $match before unwinding pets.treatment and $group will optimize the query.