MongoDB聚合不返回具有相同值的对象

时间:2015-03-16 19:28:46

标签: javascript arrays mongodb express

我使用聚合功能来获取具有特定条件的数组。因此聚合遍历集合中的所有文档,然后遍历文档中的所有宠物数组,最后遍历嵌套在宠物数组中的所有处理数组。

  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指定名称。因此,我得到的数组包含所有文档中所有处理数组的对象,其名称键等于某个用户。

1 个答案:

答案 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.