0

我试图从 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"
        }
    }
])
4

0 回答 0