如何避免重复值? [复制]

Posted

技术标签:

【中文标题】如何避免重复值? [复制]【英文标题】: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" ]) 【参考方案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

以上是关于如何避免重复值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从 DynamoDB 流复制到 Kinesis Data Streams 时如何维护顺序并避免重复记录?

mpandroidchart - 如何避免 Y 轴中的重复值?

如何检查一个值是不是已经存在以避免重复?

合并数据框时如何避免重复值?

高并发下如何避免产生重复数据?

如何避免在 SQL Server 中重复插入动态值