gpt4 book ai didi

MongoDB AddToSet 如何防止特定字段重复?

转载 作者:行者123 更新时间:2023-12-04 03:35:38 25 4
gpt4 key购买 nike

我在数据库记录的实体中有一个对象数组。我想将新对象推送到该数组,但我不想多次推送同一个对象。我知道我可以使用$addToSet,但是问题出现在我添加时间戳的每个对象中,所以这个方法不区分对象已经在数组中,它完全比较对象,如果时间戳已更改,它将添加两次,因此我将拥有:

[
{ a: 1, timestamp: X },
{ a: 1, timestamp: X+Y }
]

如您所见,我已经有了a,但由于时间戳已更改,对于$addToSet,可以再次添加此对象。

我如何检查特定字段,以便仅检查 a 属性 - 忽略时间戳?

最佳答案

您可以使用 bulkWrite 操作一次发出 2 个命令。第一个删除匹配的数组文档。然后将一个新的插入数组。所以数组中不会有重复项。

假设您有以下文件:

{
"_id" : ObjectId("606dc0a6a142af062c5ed9bc"),
"array" : [
{
"a" : 1,
"timestamp" : 12345
},
{
"a" : 2,
"timestamp" : 54321
}
]
}

您可以发出以下批量写入命令来实现您的目标:

db.Collection.bulkWrite(
[
{
updateOne: {
filter: {
_id: ObjectId("606dc0a6a142af062c5ed9bc")
},
update: {
"$pull": {
array: { a: 2 }
}
}
}
},
{
updateOne: {
filter: {
_id: ObjectId("606dc0a6a142af062c5ed9bc")
},
update: {
"$push": {
array: {
a: 2,
timestamp: 99999
}
}
}
}
}
])

如果数组对象存在,上面的代码将用提供的对象替换它。如果你只需要插入一个对象,如果它不存在于数组中,如果它存在,什么也不做,那么你可以这样做:

db.Collection.updateOne(
{
_id: ObjectId("606dc0a6a142af062c5ed9bc"),
"array.a": { $ne: 3 }
},
{
$push: {
array: {
a: 3,
timestamp: 55555
}
}
}
)

关于MongoDB AddToSet 如何防止特定字段重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66986824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com