我试图从 Mongo 中获取“组”的每一个最新条目。
您可以像一组 wiki 条目一样对数据进行映像:
- 每个条目都可以编辑(并保留旧版本)。
- 我们对最新版本的条目感兴趣。
- 条目(及其祖先)按一定的逻辑排序。
要了解更多详细信息:
- 每个条目都由一个标识
itemId
- 每个都
itemId
可以在数据集中出现 1 到 n 次 - 条目版本按
orderHash
在这里你可以看到一小批数据:
{
"_id": ObjectId("5f69b963b8705200282d6174"),
"itemId": "xszy",
"orderHash": "383u",
"title": "A",
"content": "ABC"
},
{
"_id": ObjectId("5f69b963b8705200282d6175"),
"itemId": "e92q",
"orderHash": "5j12",
"title": "K",
"content": "KLMN"
},
{
"_id": ObjectId("5f69b963b8705200282d6178"),
"itemId": "xszy",
"orderHash": "p578",
"title": "A",
"content": "ABD"
},
{
"_id": ObjectId("5f69b963b8705200282d6180"),
"itemId": "mtewy",
"orderHash": "383u",
"title": "L",
"content": "CASE"
},
{
"_id": ObjectId("5f69b963b8705200282d6189"),
"itemId": "mtewy",
"orderHash": "5j12",
"title": "L1",
"content": "CASE"
}
我使用以下聚合管道来获得我想要的结果:
db.getCollection('wiki').aggregate([
{
// create a sortable field for mongo
$set: {
"sortField": {
"$indexOfArray": [
[ "p578", "5j12", "383u" ], "$orderHash"
]
}
}
},
{
// sort by created sort field
"$sort": {
"sortField": 1
}
},
{
// group items by itemId and "save" them sorted in an array
$group: {
_id: "$itemId",
data: {
$push: "$$ROOT"
}
}
},
{
// get first entry of each "group array" to obtain
// the latest version of each entry
$project: {
resp: { $arrayElemAt: ['$data', 0] }
}
}
])
到目前为止,这是有效的。但是将数据存储在一个额外的数组中感觉不对,而且我不确定性能(尤其是对于具有大量编辑的较大数据集)。另一个缺陷是我不是简单地返回一组文档,而是将数据嵌套在文档属性中resp
(这对于例如猫鼬来说是不好的)。
我的问题有更多的 mongo-nic 解决方案吗?
解决方案:
感谢乔(见评论)。他向我指出了解决方案。
db.getCollection('wiki').aggregate([
{
$set: {
"sortField": {
"$indexOfArray": [
[ "p578", "5j12", "383u" ], "$orderHash"
]
}
}
},
{
"$sort": {
"sortField": 1
}
},
{
$group: {
_id: "$itemId",
resp: {
$first: "$$ROOT"
}
}
},
{
$replaceRoot: {
newRoot: "$resp"
}
}
])