我正在尝试查询一个预先构建的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上的文档,但无法获得所需的信息。我觉得我用来解决该问题的方法效率极低,并希望有人可以指出正确的方向。
现在,我正在这样做:
获取所有SKU:
db.products.distinct('sku', { provider: "MySupplier5" }, { _id: 0, sku: 1 })
遍历所有SKU并获取最新版本:
db.products.find({ sku: 'abc123' }).sort({ revision: -1 }).limit(1)
那行得通,但是感觉效率低下。
我能够使用Mongoid来使这两个查询正常运行,并且我确定我也可以将给出的任何内容转换为Ruby等效项。我只是想不通在Mongo中怎么说“只给我最新的修订版”。
谢谢!
答案 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"
}
]