【问题标题】:How to avoid duplicate values ? [duplicate]如何避免重复值? [复制]
【发布时间】:2019-03-30 21:00:31
【问题描述】:

我是 Mongo Db 的新手,希望对此查询有所帮助。我的 mongodb 数据横断相同的 ids 数量基于 create_date 如何显示每个横断 id 第一条记录

 db.collection.aggregate([{
     {"$project": {
     "RESOURCE_ID": 1,
     "TRANSACTION_ID":1,
     "CREATE_DATE":1
   }}

  ]) 

输出:

      RESOURCE_ID         TRANSACTION_ID              CREATE_DATE   
1      "100-101"      "0:ffff0a0a0983UY:-142"   "Fri Sep 07 16:51:30IST2018"
2      "100-101"      "0:ffff0a0a0983UY:-142"   "Fri Sep 07 16:51:29IST2018"
3      "100-101"      "0:ffff0a0a0983UY:-142"   "Fri Sep 07 16:51:29IST2018"
4      "100-102"      "0:ffff0a0a0983UY:-111"   "Fri Sep 06 16:51:29IST2018"
5      "100-102"      "0:ffff0a0a0983UY:-111"   "Fri Sep 06 16:51:28IST2018"

预期输出:

       RESOURCE_ID         TRANSACTION_ID              CREATE_DATE   
1      "100-101"      "0:ffff0a0a0983UY:-142"   "Fri Sep 07 16:51:30IST2018"
2      "100-102"      "0:ffff0a0a0983UY:-111"   "Fri Sep 06 16:51:29IST2018"

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 使用 $project iam 获取 RESOURCE_ID 和 TRANSACTION_ID 和 CREATE_DATE 我是 Mongo Db 开发人员的新手,我不知道每个 teransection id 第一个记录是基于 cerate 日期@Hagai
  • 你能把你尝试过的完整查询和它给你的结果放在这里吗?我会尽力提供帮助
  • db.collection.aggregate([{ {"$project": { "RESOURCE_ID": 1, "TRANSACTION_ID":1, "CREATE_DATE":1 }}, ]) @Hagai
  • 试试db.collection.aggregate([ {$sort:{'CREATE_DATE':-1}}, {$group:{ _id: '$RESOURCE_ID',doc:{$first:'$$ROOT'}}}, {$replaceRoot:{newRoot:"$doc"}} ])

标签: mongodb mongoose aggregation-framework aggregate-functions


【解决方案1】:

这就是你想要的: db.collection.aggregate([{"$sort": {CREATE_DATE: 1}},{$group:{"_id": "$RESOURCE_ID", TRANSACTION_ID: {$first: "$TRANSACTION_ID"}, "CREATE_DATE": {$first: "$CREATE_DATE"}}}])

它的作用 - 按日期对所有文档进行升序排序,因为我们首先要最旧的文档(注意 sort 子句)。
然后,它按字段“RESOURCE_ID”(标记为新的_id)对文档进行分组,并获取$first TRANSACTION_ID 和$first CREATE_DATE。

请注意,您必须将时间戳转换为实际时间戳,以便 mongo 真正了解时间戳的顺序。否则 mongo 会将它们排序为字符串,这不是你想要的

一个例子:

> db.collection.find().pretty()
{
    "_id" : ObjectId("5bd2bf353ca22147747ec212"),
    "RESOURCE_ID" : "100-101",
    "TRANSACTION_ID" : "0:ffff0a0a0983UY:-142",
    "CREATE_DATE" : ISODate("2017-10-13T10:53:53Z")
}                                                 
{
    "_id" : ObjectId("5bd2bf3c3ca22147747ec213"),
    "RESOURCE_ID" : "100-101",
    "TRANSACTION_ID" : "0:ffff0a0a0983UY:-142",
    "CREATE_DATE" : ISODate("2017-10-14T10:53:53Z")
}
{
    "_id" : ObjectId("5bd2bf3c3ca22147747ec214"),
    "RESOURCE_ID" : "100-102",
    "TRANSACTION_ID" : "0:ffff0a0a0983UY:-111",
    "CREATE_DATE" : ISODate("2017-10-13T10:53:53Z")
}
{
    "_id" : ObjectId("5bd2bf3c3ca22147747ec215"),
    "RESOURCE_ID" : "100-102",
    "TRANSACTION_ID" : "0:ffff0a0a0983UY:-111",
    "CREATE_DATE" : ISODate("2017-10-14T10:53:53Z")
}


> db.collection.aggregate([{"$sort": {CREATE_DATE: 1}},{$group:{"_id": "$RESOURCE_ID", TRANSACTION_ID: {$first: "$TRANSACTION_ID"}, "CREATE_DATE": {$first: "$CREATE_DATE"}}}])
{ "_id" : "100-102", "TRANSACTION_ID" : "0:ffff0a0a0983UY:-111", "CREATE_DATE" : ISODate("2017-10-13T10:53:53Z")
{ "_id" : "100-101", "TRANSACTION_ID" : "0:ffff0a0a0983UY:-142", "CREATE_DATE" : ISODate("2017-10-13T10:53:53Z")

另外,值得一提的是,您应该为 CREATE_DATE 添加索引,因为您是按此字段排序的,而对于 RESOURCE_ID,因为 mongo 必须对其进行排序才能按它进行分组

【讨论】:

  • 你好Hagai小帮助........@Hagai
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多