Mongo查询条目的最新版本

时间:2020-09-22 09:53:50

标签: arrays mongodb sorting custom-sort

我试图从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中(不适用于例如猫鼬)。

我的问题是否还有更多的蒙古解决方案?

解决方案:

感谢乔(请参阅评论)。他为我指出了解决方案。

db.getCollection('wiki').aggregate([
    {
        $set: { 
            "sortField": {
                "$indexOfArray": [
                    [ "p578", "5j12", "383u" ], "$orderHash"
                ]
            }
        }
    },
    {
        "$sort": {
            "sortField": 1 
        }
    },
    {
        $group: {
            _id: "$itemId",
            resp: {
                $first: "$$ROOT"
            }
        }
    },
    { 
        $replaceRoot: { 
            newRoot: "$resp"
        }
    }
])

0 个答案:

没有答案