首页 > 解决方案 > 具有子文档属性的猫鼬组

问题描述

我正在尝试一些事件,并且必须通过查询运行一个组,但我无法通过它,因为它主要在子文档上。

这是我目前的数据库:

{ 
"_id" : ObjectId("5bbb6e1c7f3fc62db401d05a"), 
"type" : "ADD_BOOK", 
"metadata" : {
    "_id" : ObjectId("5bbb6e1c7f3fc62db401d05b"), 
    "name" : "ad", 
    "author" : "ad", 
    "imgUrl" : "https://vignette.wikia.nocookie.net/simpsons/images/6/60/No_Image_Available.png"
}, 
"timestamp" : 1539010076240.0, 
"__v" : NumberInt(0)
},
{ 
"_id" : ObjectId("5bbb736ad441d505589ccecc"), 
"type" : "ADD_BOOK", 
"metadata" : {
    "_id" : ObjectId("5bbb736ad441d505589ccecb"), 
    "name" : "ada", 
    "author" : "ada", 
    "imgUrl" : "https://vignette.wikia.nocookie.net/simpsons/images/6/60/No_Image_Available.png"
}, 
"timestamp" : 1539011434826.0, 
"__v" : NumberInt(0)
},
{ 
"_id" : ObjectId("5bbb7373d441d505589ccecd"), 
"type" : "DELETE_BOOK", 
"metadata" : {
    "_id" : "5bbb736ad441d505589ccecb"
}, 
"timestamp" : 1539011443792.0, 
"__v" : NumberInt(0)
}

我希望输出如下:

[
  {
    "_id": ObjectId("5bbb736ad441d505589ccecb"),
    "books": [
        {
            "type": "ADD_BOOK",
            "metadata": {
                "_id": ObjectId("5bbb736ad441d505589ccecb"),
                "name": "ada",
                "author": "ada",
                "imgUrl": "https://vignette.wikia.nocookie.net/simpsons/images/6/60/No_Image_Available.png"
            }
        }
        {
            "type": "DELETE_BOOK",
            "metadata": {
              "_id": ObjectId("5bbb736ad441d505589ccecb")
            }
        }
    ]
  },
  {
    "_id": ObjectId("5bbb6e1c7f3fc62db401d05b"),
    "books": [
        {
            "type": "ADD_BOOK",
            "metadata": {
                "_id": ObjectId("5bbb6e1c7f3fc62db401d05b"),
                "name": "ad",
                "author": "ad",
                "imgUrl": "https://vignette.wikia.nocookie.net/simpsons/images/6/60/No_Image_Available.png"
            }
        }
    ]
  }
]

我当前的实现尝试这样的事情:

db.bookevents.aggregate([
    { $match: { }},
    { $group: { _id: "$metadata._id", books: { $push: "$$ROOT" } } }
])

这不能按预期工作。我正在尝试阅读文档,但我还无法弄清楚这一点。

是否有可能解决这个问题而不是别的东西$group?我们还可$sort以为每个设置一个时间戳books[]吗?

PS我知道问题主要是代码,但我不知道如何以任何其他方式表达。

标签: mongodbaggregation-framework

解决方案


您得到的是3组而不是预期的2,因为metadata._idforDELETE_BOOKstring类型,而所有其他都是ObjectId类型。您必须手动修复它,或者如果可以使用 MongoDB 4.0,那么您可以使用$toObjectId运算符在之前转换该值$group。此外,您可以$sort在分组之前申请并使用$project. 尝试:

db.bookevents.aggregate([
    { $addFields: { "metadata._id": { $toObjectId: "$metadata._id" } } }, // or fix manually
    { $sort: { timestamp: 1 } },
    { $group: { _id: "$metadata._id", books: { $push: "$$ROOT" } } },
    { $project: { "books.timestamp": 0, "books.value": 0, "books.__v": 0 } }
])

推荐阅读