MongoDB:如何查找只包含最新更改信息的文档?
在应用程序中,我们已经有了记录实体中发生的更改的机制。 例如,我们有MongoDB:如何查找只包含最新更改信息的文档?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,在应用程序中,我们已经有了记录实体中发生的更改的机制。 例如,我们有类别和产品实体 其中,类别如下所示: Category { name; description } Product { name; price; quantity } 而产品看起来像: Category { name; description } Product { name; price; quantity } 目前,我们在修改实体的任何字段时记录信息: 假设类别实体 name属性更改了两次; descriptio
类别
和产品
实体
其中,类别
如下所示:
Category {
name;
description
}
Product {
name;
price;
quantity
}
而产品
看起来像:
Category {
name;
description
}
Product {
name;
price;
quantity
}
目前,我们在修改实体的任何字段时记录信息:
假设类别
实体
name
属性更改了两次;
description
属性更改了3次
对于产品
实体
唯一的price
属性更改了两次
然后在我们的LogCollection
中,我们将有以下文档
s:
[
{
"_id": 1,
"entity": "Category",
"property": "name",
"changed": "2020-08-30"
},
{
"_id": 2,
"entity": "Category",
"property": "name",
"changed": "2020-08-31"
},
{
"_id": 3,
"entity": "Category",
"property": "description",
"changed": "2020-08-29"
},
{
"_id": 4,
"entity": "Category",
"property": "description",
"changed": "2020-08-30"
},
{
"_id": 5,
"entity": "Category",
"property": "description",
"changed": "2020-08-31"
},
{
"_id": 6,
"entity": "Product",
"property": "price",
"changed": "2020-08-20"
},
{
"_id": 7,
"entity": "Product",
"property": "price",
"changed": "2020-08-31"
}
]
我现在试图解决的问题是:
我只想为每个唯一实体提取每个字段的最新更改
我的意思是,通过一些神奇的查询,我将得到以下文档列表:
[
{
"_id": 2,
"entity": "Category",
"property": "name",
"changed": "2020-08-31"
},
{
"_id": 5,
"entity": "Category",
"property": "description",
"changed": "2020-08-31"
},
{
"_id": 7,
"entity": "Product",
"property": "price",
"changed": "2020-08-31"
}
]
这3个文档
向我显示了每个唯一实体的实体字段的最新更改的确切时间
你能不能帮我查询一下这3份文件
当然,我已经查看了Mongo DB文档,发现我可能必须使用聚合框架和$group
和$max
操作符,但我仍然坚持编写真正的工作查询这可以通过阶段来完成
首先$match
限制所考虑的文档数量,除非您真的希望从一开始就检查每个日志文档。
按changed
字段降序排序,以使最新文档排在第一位。
按实体
和属性
分组,只保留遇到的第一个文档。
使用$replaceRoot
或$project
按需要重新构造文档
请注意,如果2发生在同一天,则示例数据无法确定哪个更新最先出现
db.collection.aggregate([
{$match: {}}, //if desired
{$sort: {changed: -1}},
{$group: {
_id: {
property: "$property",
entity: "$entity"
},
document: {$first: "$$ROOT"}
}},
{$replaceRoot: {newRoot: "$document"}}
])