Arrays Mongo查询条目的最新版本

Arrays Mongo查询条目的最新版本,arrays,mongodb,sorting,custom-sort,Arrays,Mongodb,Sorting,Custom Sort,我试图从Mongo中获取“组”的每个最新条目 您可以将数据图像化为一组wiki条目: 每个条目都可以编辑(保留旧版本) 我们对最新版本的参赛作品感兴趣 条目(及其祖先)按特定逻辑排序 要了解更多详细信息,请执行以下操作: 每个条目由一个itemId 每个itemId可以在数据集中出现1到n次 条目版本按orderHash 在这里,您可以看到一小批数据: { "_id": ObjectId("5f69b963b8705200282d6174"

我试图从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
(这不适合用于mongoose)

对于我的问题,是否有更多的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"
        }
    }
])

使用
$first
而不是
$push
会得到你想要的吗?是的!是的。非常感谢。这也节省了一个管道步骤。那么只剩下一个问题了。也许是
$replaceRoot
阶段?再次:是的!非常感谢。