mongodb - 具有子文档属性的猫鼬组
问题描述
我正在尝试一些事件,并且必须通过查询运行一个组,但我无法通过它,因为它主要在子文档上。
这是我目前的数据库:
{
"_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我知道问题主要是代码,但我不知道如何以任何其他方式表达。
解决方案
您得到的是3
组而不是预期的2
,因为metadata._id
forDELETE_BOOK
是string类型,而所有其他都是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 } }
])