MongoDB:获取所有具有最新修订版本的条目

时间:2019-05-10 18:59:19

标签: mongodb mongoid mongo-shell

我正在尝试查询一个预先构建的MongoDB,该数据库保留每个条目的修订信息。数据示例如下:

{
  "_id": ObjectId("5cd48bad15447900012fae00"),
  "sku": "abc123",
  "_revision": 5
  "_created": ISODate("2019-05-10T15:00:00.000Z"),
  "provider": "MySupplier5"
}

在此示例中,具有相同记录的条目具有:

  • 不同的_id
  • 相同sku
  • 相同provider
  • _revision设置为1、2、3和4(每个文档一个)
  • 可变的_created日期

我要选择的是:

  

所有提供者集为“ MySupplier5”的文档,但只有最新的修订版。

我尝试阅读Aggregate上的文档,但无法获得所需的信息。我觉得我用来解决该问题的方法效率极低,并希望有人可以指出正确的方向。

现在,我正在这样做:

  1. 获取所有SKU:

    db.products.distinct('sku', { provider: "MySupplier5" }, { _id: 0, sku: 1 })

  2. 遍历所有SKU并获取最新版本:

    db.products.find({ sku: 'abc123' }).sort({ revision: -1 }).limit(1)

那行得通,但是感觉效率低下。

我能够使用Mongoid来使这两个查询正常运行,并且我确定我也可以将给出的任何内容转换为Ruby等效项。我只是想不通在Mongo中怎么说“只给我最新的修订版”。

谢谢!

1 个答案:

答案 0 :(得分:0)

对于那些根据链接提供我想要的答案的人,只要我在此处列出该链接即可(对于迟来的答案表示歉意)。

以下所有链接使我能够学习并准确了解我的需求:

[
  {
    "$group": {
      "_id": "$sku",
      "maxRevision": { "$max": "$revision" },
      "originalDocuments": { "$push": "$$ROOT" }
    }
  },
  {
    "$project": {
      "originalDocument": {
        "$filter": {
          "input": "$originalDocuments",
          "as": "doc",
          "cond": {
            "$and": [
              { "$eq": ["abc123", "$$doc.sku"] },
              { "$eq": ["$maxRevision", "$$doc.revision"] }
            ]
          }
        }
      }
    }
  },
  {
    "$unwind": "$originalDocument"
  }
]