Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB:如何查找只包含最新更改信息的文档?_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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"}}
])