如何解决MongoDB:如何查找仅包含最新更改信息的文档?
在应用程序中,我们已经有了记录实体中发生的更改的机制。
例如,我们有Category
和Product
个实体,
Category
如下:
Category {
name;
description
}
和Product
如下:
Product {
name;
price;
quantity
}
当前,当我们修改实体的任何字段时,我们都会记录信息:
假设Category
实体的
name
属性已更改两次;
description
属性已更改3次;
以及Product
实体
唯一的price
属性被更改了两次。
然后在我们的LogCollection
中,我们将有以下Document
:
[
{
"_id": 1,"entity": "Category","property": "name","changed": "2020-08-30"
},{
"_id": 2,"changed": "2020-08-31"
},{
"_id": 3,"property": "description","changed": "2020-08-29"
},{
"_id": 4,{
"_id": 5,{
"_id": 6,"entity": "Product","property": "price","changed": "2020-08-20"
},{
"_id": 7,"changed": "2020-08-31"
}
]
我现在要解决的问题:
我只想为每个唯一实体的每个字段提取最新更改。
我的意思是,由于进行了一些魔术查询,我将获得以下文档列表:
[
{
"_id": 2,"changed": "2020-08-31"
}
]
这3个Documents
向我显示了每个唯一实体对实体字段进行的最新更改的确切时间。
请问我能得到这3个Documents
来支持我吗?
可以肯定的是,我已经阅读了Mongo DB文档,发现可能必须将聚合框架与$group
和$max
运算符一起使用,但是我仍然坚持编写实际的工作查询
解决方法
这可以通过$group阶段完成。
首先$match
以限制所考虑的文档数量,除非您实际上想要检查自时间开始以来的每个日志文档。
按changed
字段按降序排序,因此最新的文档排在第一位。
按entity
和property
分组,仅保留遇到的第一个文档。
使用$replaceRoot
或$project
来按需要重组文档。
请注意,如果同一天发生2次,示例数据将无法确定哪个更新先出现。
db.collection.aggregate([
{$match: {}},//if desired
{$sort: {changed: -1}},{$group: {
_id: {
property: "$property",entity: "$entity"
},document: {$first: "$$ROOT"}
}},{$replaceRoot: {newRoot: "$document"}}
])
,
//source data,sort by latest date changed as the first document in the output/collection
> db.logCollection.find().sort({Category:1,property:1,changed:-1});
{ "_id" : 5,"entity" : "Category","property" : "description","changed" : "2020-08-31" }
{ "_id" : 4,"changed" : "2020-08-30" }
{ "_id" : 3,"changed" : "2020-08-29" }
{ "_id" : 2,"property" : "name","changed" : "2020-08-31" }
{ "_id" : 1,"changed" : "2020-08-30" }
{ "_id" : 7,"entity" : "Product","property" : "price","changed" : "2020-08-31" }
{ "_id" : 6,"changed" : "2020-08-20" }
//use sort to reflect latest document first and use $first as shown below
> db.logCollection.aggregate([
... {$sort:{Category:1,changed:-1}},... {$group:{_id:{entity: "$entity",... property: "$property"},... latestChange: {$first:"$changed"}
... }
... },... ]);
{ "_id" : { "entity" : "Category","property" : "name" },"latestChange" : "2020-08-31" }
{ "_id" : { "entity" : "Product","property" : "price" },"latestChange" : "2020-08-31" }
{ "_id" : { "entity" : "Category","property" : "description" },"latestChange" : "2020-08-31" }
>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。