我正在尝试一些事件处理,不得不通过查询来运行一个组,但是我无法通过它,因为它主要在子文档上。
这是我当前的数据库:
{
"_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[]
的时间戳吗?
P.S。我知道问题主要是代码,但我不知道如何以其他方式提出。
答案 0 :(得分:1)
您得到3
组,而不是预期的2
,因为metadata._id
的{{1}}类型为 string ,而所有其他类型都是键入 ObjectId 。您必须手动修复该问题,或者如果可以使用MongoDB 4.0,则可以使用$toObjectId运算符在DELETE_BOOK
之前转换该值。另外,您可以在分组之前应用$group
,并使用$sort
摆脱不必要的字段。试试:
$project