我需要一个查询从"A“集合中删除重复的文档。一旦重复被删除,那么我将创建一个"A“集合的索引。
"A“藏书有近132920份文件。
请查找"A“集合Mongo DB文档结构,
/*1 */
{
"_id" : ObjectId("5d654ed25616a9d461bc0aa7"),
"aC" : "AB",
"aI" : "ABCD",
"aN" : "000000002001",
"aT" : "CA",
"bID" : NumberLong(0),
"pD" : "2019-06-18",
"transactions" : [
{
"seqNo" : 1,
"tC" : "S"
},
{
"seqNo" : 2,
"tC" : "S"
},
{
"seqNo" : 2,
"tC" : "S"
},
{
"seqNo" : 1,
"tC" : "S"
},
{
"seqNo" : 3,
"tC" : "S"
}
]
}
/*2*/
{
"_id" : ObjectId("5d654ed25616a9d461bc0aa8"),
"aC" : "AB",
"aI" : "ABCD",
"aN" : "000000002002",
"aT" : "CA",
"bID" : NumberLong(0),
"pD" : "2019-06-18",
"transactions" : [
{
"seqNo" : 1,
"tC" : "S"
},
{
"seqNo" : 2,
"tC" : "S"
},
{
"seqNo" : 2,
"tC" : "S"
},
{
"seqNo" : 1,
"tC" : "S"
},
{
"seqNo" : 3,
"tC" : "S"
}
]
}预期产出:
/*1*/
{
"_id" : ObjectId("5d654ed25616a9d461bc0aa7"),
"aC" : "AB",
"aI" : "ABCD",
"aN" : "000000002001",
"aT" : "CA",
"bID" : NumberLong(0),
"pD" : "2019-06-18",
"transactions" : [
{
"seqNo" : 1,
"tC" : "S"
},
{
"seqNo" : 2,
"tC" : "S"
},
{
"seqNo" : 3,
"tC" : "S"
}
]
}
/*2*/
{
"_id" : ObjectId("5d654ed25616a9d461bc0aa8"),
"aC" : "AB",
"aI" : "ABCD",
"aN" : "000000002002",
"aT" : "CA",
"bID" : NumberLong(0),
"pD" : "2019-06-18",
"transactions" : [
{
"seqNo" : 1,
"tC" : "S"
},
{
"seqNo" : 2,
"tC" : "S"
},
{
"seqNo" : 3,
"tC" : "S"
}
]
}在从“事务数组”中删除重复项之后。我将创建"A“集合的主要索引如下,
{
"aC" : 1.0,
"aI" : 1.0,
"aN" : 1.0,
"aT" : 1.0,
"bID" : 1.0,
"pD" : 1.0}
请帮助我从"A“集合中移除重复的文档,以便我可以启用"A”集合的索引吗?
在查询方面需要帮助。
提前谢谢。这会很有帮助的。
发布于 2022-11-10 07:00:31
有一种方法你可以做到。
db.collection.update({
"transactions": {"$type": "array"}
},
[
{
"$set": {
"transactions": {"$setUnion": "$transactions"}
}
}
],
{"multi": true}
)在mongoplayground.net上试一试。
编辑
我不知道是mongoplayground.net还是MongoDB的“奇怪”/bug,但我怀疑有什么东西“重新排序”了"transactions"数组对象中的字段。
这里有一个“解决方案”,它在"$setUnion"之前重写每个元素。
db.collection.update({
"transactions": {"$type": "array"}
},
[
{
"$set": {
"transactions": {
"$setUnion": {
"$map": {
"input": "$transactions",
"as": "xaction",
"in": {
"seqNo": "$$xaction.seqNo",
"tC": "$$xaction.tC"
}
}
}
}
}
}
],
{"multi": true}
)在mongoplayground.net上试一试。
https://stackoverflow.com/questions/74385038
复制相似问题