Javascript MongoDB聚合不';t返回具有相同值的对象

Javascript MongoDB聚合不';t返回具有相同值的对象,javascript,arrays,mongodb,express,Javascript,Arrays,Mongodb,Express,我使用聚合功能返回具有特定条件的数组。所以聚合将遍历集合中的所有文档,然后遍历文档中的所有pets数组,最后遍历嵌套在pets数组中的所有处理数组 db.collection.aggregate({$unwind:"$pets"},{$group:{"_id":"$pets.treatments"}}, {$unwind:"$_id"},{$group:{"_id":"$_id"}},{$match: {"_id.name":"name"}} 结果我得到了这样的东西: [{

我使用聚合功能返回具有特定条件的数组。所以聚合将遍历集合中的所有文档,然后遍历文档中的所有pets数组,最后遍历嵌套在pets数组中的所有处理数组

  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


我的目标是创建一个数组,该数组将包含所有文档中的所有对象。所以每个文档都有一个pets数组,pets数组中的每个对象都有一个数组。我想在所有文档中使用所有这些处理数组,并使用$match指定名称。因此,我有一个数组,其中包含所有文档中所有治疗数组中的对象,该名称键等于某个用户。

因为我不确定“使用$match指定名称”是什么意思,因为pets数组也有“名称”,治疗数组也有“名称”。我假设您希望在“pets.name”上匹配$match,并获得阵列中的所有治疗。 因为,宠物是一个数组,首先将它们展开,然后进行治疗,因为它也是一个数组,然后与“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,请将$match替换为“$pets.treatments.name”,并将$group中的_id替换为“$pets.treatments.name”
在解开pets.treatment和$group之前写入$match将优化查询。

因为我不确定“使用$match指定名称”是什么意思,因为pets数组也有“name”,而treatments数组也有“name”。我假设您希望在“pets.name”上匹配$match,并获得阵列中的所有治疗。 因为,宠物是一个数组,首先将它们展开,然后进行治疗,因为它也是一个数组,然后与“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,请将$match替换为“$pets.treatments.name”,并将$group中的_id替换为“$pets.treatments.name”
在解开pets.treatment和$group之前写入$match将优化查询。

因为我不确定“使用$match指定名称”是什么意思,因为pets数组也有“name”,而treatments数组也有“name”。我假设您希望在“pets.name”上匹配$match,并获得阵列中的所有治疗。 因为,宠物是一个数组,首先将它们展开,然后进行治疗,因为它也是一个数组,然后与“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,请将$match替换为“$pets.treatments.name”,并将$group中的_id替换为“$pets.treatments.name”
在解开pets.treatment和$group之前写入$match将优化查询。

因为我不确定“使用$match指定名称”是什么意思,因为pets数组也有“name”,而treatments数组也有“name”。我假设您希望在“pets.name”上匹配$match,并获得阵列中的所有治疗。 因为,宠物是一个数组,首先将它们展开,然后进行治疗,因为它也是一个数组,然后与“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,请将$match替换为“$pets.treatments.name”,并将$group中的_id替换为“$pets.treatments.name”
在解除pets.treatment和$group之前写入$match将优化查询。

完全不清楚您想做什么<代码>{“$uwnid”:“$\u id”},{“{”$group:{“\u id”:“$\u id”}在这里什么都不做。我对mognodb没有太多经验,但我这样做是为了得到一个包含对象的数组作为结果。如果您不介意的话,如果您能纠正我,我将非常高兴。我更新了问题。您可以展示一些文档以及您希望从中获得的结果吗?现在我们有了一个文档,但结果是什么你想从这些数据中得到什么?从多个文档中得到什么?完全不清楚你想做什么。
{“$uwnind”:“$\u id”},{“{“$group”:{“\u id”:“$\u id”}
在这里什么都不做。我对mognodb没有太多经验,但我这样做是为了得到一个包含对象的数组作为结果。如果您不介意的话,如果您能纠正我,我将非常高兴。我更新了问题。您可以展示一些文档以及您希望从中获得的结果吗?现在我们有了一个文档,但结果是什么你想从这些数据中得到什么?从多个文档中得到什么?完全不清楚你想做什么。
{“$uwnind”:“$\u id”},{“{“$group”:{“\u id”:“$\u id”}
在这里什么都不做。我对mognodb没有太多经验,但我这样做是为了得到一个包含对象的数组作为结果。如果您不介意的话,如果您能纠正我,我将非常高兴。我更新了问题。您可以展示一些文档以及您希望从中获得的结果吗?现在我们有了一个文档,但结果是什么你想从这些数据中得到什么?从多个文档中得到什么呢?完全不清楚你想做什么。
{“$uwnind”:“$\id”},{“{“$group”:{“\u id”:“$\u id”}
就是这样做的