【问题标题】:Mongo query how to retrieve the latest inserted array value?Mongo查询如何检索最新插入的数组值?
【发布时间】:2021-04-06 15:28:24
【问题描述】:

我有一个 mongodb 集合,其中包含一些数组值,例如 ActivityType、Note 和 ActivityDate。数组名称称为活动。我需要重命名一些字段,所以我使用了聚合和 $project 来重命名输出的一些列。但是我只需要为数组值返回最新插入的 ActivityDate。

我当前的查询返回Activity数组中的所有数组值:

db.test.aggregate([
   {$match: {}
},   {$unwind: "$activities"},
        {$match: {}},



{ "$project": {
         "_id" : 0,
      "Project Number": "$ProjectNumber" ,
      "Activity Type": "$activities.activityTypeDesc" ,
      "Date of Activity": { 
                "$dateToString": { "format": "%Y-%m-%d", "date": "$activities.dateOfActivity" } 
            }
    }}
   ])

这有点像在 sql server 中获得前 1 个订单。我如何在 Mongodb 中做到这一点?经过一番阅读,我似乎需要使用 $sort 和 $group,但我不知道如何适应这里。

我在下面有一些示例数据:

{
    "_id" : ObjectId("5fd289a93f7cf02c36837ca7"),
    "ProjectNumber" : "ABC1234567",
    "activities" : [ 
        {
            "activityTypeDesc" : "Type1",
            "dateOfActivity" : ISODate("2021-02-20T06:00:00.000Z"),
            "activityNote" : ""
        }, 
        {
            "activityTypeDesc" : "Type2",
            "dateOfActivity" : ISODate("2021-03-04T06:00:00.000Z"),
            "activityNote" : ""
        }, 
        {
            "activityTypeDesc" : "Type3",
            "dateOfActivity" : ISODate("2021-01-04T06:00:00.000Z"),
            "activityNote" : ""
        }, 
        {
            "activityTypeDesc" : "Type4",
            "dateOfActivity" : ISODate("2021-04-15T05:00:00.000Z"),
            "activityNote" : ""
        }
    ]
}

{
    "_id" : ObjectId("5fd2ca65d1a01d157c0179be"),
    "ProjectNumber" : "12345",
    "activities" : []
}

查询的结果应该返回两行,一行是最新的activitydate,另一行是没有activitydate(因为没有数组值) 任何帮助将不胜感激!

【问题讨论】:

  • 您的具体要求是什么,您想从数组中获取最新元素还是只需要重命名字段名称?
  • 我两者都需要。我需要获取所有具有最新活动日期的数组元素,但我还需要将列重命名为其他内容。
  • 好的,你将如何确定哪个元素的活动日期最近?
  • 我在文档中有一个数组,如下所示: "activities" : [ { "activityTypeDesc" : "Type1", "dateOfActivity" : ISODate("2021-02-20T06:00:00.000Z "), "activityNote" : "" }, { "activityTypeDesc" : "Type2", "dateOfActivity" : ISODate("2021-03-04T06:00:00.000Z"), "activityNote" : "" } ]。所以我只需要按 dateOfActivity 顺序获取最新的一组数组值。但在数组之外,我还有其他字段需要重命名。

标签: mongodb mongodb-query


【解决方案1】:
  • $unwind解构activities数组
  • $sort dateOfActivity 按降序排列
  • $group by _id 并获取第一个活动必填字段
db.collection.aggregate([
  {
    $unwind: {
      path: "$activities",
      preserveNullAndEmptyArrays: true
    }
  },
  { $sort: { "activities.dateOfActivity": -1 } },
  {
    $group: {
      _id: "$_id",
      "Project Number": { $first: "$ProjectNumber" },
      "Activity Type": { $first: "$activities.activityTypeDesc" },
      "Date Of Activity": {
        $first: {
          "$dateToString": {
            "format": "%Y-%m-%d",
            "date": "$activities.dateOfActivity"
          }
        }
      }
    }  
  }
])

Playground

【讨论】:

  • 谢谢。上述查询仅返回 DateOfActivity 降序排列的数组。但我只需要得到最新的。意思是 top 1. 所以当前查询返回下面的数组: "activities" : [ { "Activity Type" : "Type1", "Date Of Activity" : "3921-02-09" }, { "Activity Type" : " Type2", "活动日期" : "2021-02-07" } ],
  • 而我只需要返回:“活动”:[{“活动类型”:“Type1”,“活动日期”:“3921-02-09”}],有什么想法吗?谢谢
  • 你能确认一下吗mongoplayground.net/p/tCRKjly1AzE
  • 没关系。我可以通过添加 $first, $group: { _id: "$_id", "Project Name": { $first: "$ProjectName" }, "Activity Type" : {$first: " $activities.activityTypeDesc"}, "活动日期": { $first: {"$dateToString" : { "format": "%Y-%m-%d","date": "$activities.dateOfActivity"} }} ,但我注意到有一些数据丢失,那些数据没有数组值,这意味着活动日期为空。那些也应该返回。我怎样才能将它们添加回来?
  • 哪些活动是空的,我没有让你看看这个工作playground,如果你仍然得到空,那么在这个操场上添加示例数据并分享
猜你喜欢
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多