具有子文档属性的猫鼬组

时间:2018-10-08 18:39:55

标签: mongodb aggregation-framework

我正在尝试一些事件处理,不得不通过查询来运行一个组,但是我无法通过它,因为它主要在子文档上。

这是我当前的数据库:

{ 
"_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。我知道问题主要是代码,但我不知道如何以其他方式提出。

1 个答案:

答案 0 :(得分:1)

您得到3组,而不是预期的2,因为metadata._id的{​​{1}}类型为 string ,而所有其他类型都是键入 ObjectId 。您必须手动修复该问题,或者如果可以使用MongoDB 4.0,则可以使用$toObjectId运算符在DELETE_BOOK之前转换该值。另外,您可以在分组之前应用$group,并使用$sort摆脱不必要的字段。试试:

$project