如何避免重复值? [复制]
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 时如何维护顺序并避免重复记录?