【问题标题】:MongoDB aggregate doesn't return objects which have the same valuesMongoDB 聚合不返回具有相同值的对象
【发布时间】:2015-03-18 13:27:23
【问题描述】:

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

  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 指定名称。所以结果我有一个数组,其中包含来自所有文档中所有处理数组的对象,其中名称键等于某个用户。

【问题讨论】:

  • 完全不清楚您要做什么。 { "$uwnind": "$_id" },{ "{ "$group": { "_id": "$_id" }} 在这里什么都不做。
  • 我对 mognodb 不是很有经验,但我这样做是为了得到一个包含对象的数组。如果你不介意,如果你能纠正我,我会很高兴。我更新了问题。
  • 您能否展示一些文档以及您希望从中获得的结果。
  • 现在我们有了一个文档,但是您希望从该数据中得到什么结果?来自多个文档呢? stackoverflow.com/help/mcve

标签: javascript arrays mongodb express


【解决方案1】:

由于我不确定“使用 $match 指定名称”是什么意思,因为宠物数组也有“名称”,而治疗数组也有“名称”。我假设您想在“pets.name”上进行 $match 并在一个数组中获取所有处理。 因为,pets 是一个数组,首先展开它们然后展开处理,因为它也是一个数组,然后匹配 '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”。 Writing $match before unwinding pets.treatment and $group will optimize the query.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2023-02-13
    • 2021-12-05
    • 2015-06-16
    相关资源
    最近更新 更多