gpt4 book ai didi

python - 是否可以在同一更新中多次使用 $addToSet?

转载 作者:可可西里 更新时间:2023-11-01 10:04:58 24 4
gpt4 key购买 nike

所以我希望我的收藏中的文档在结构上看起来像这样:

{
"_id": "123",
"systems": [
{
"_id": "1338",
"metrics": [
"TEST"
]
}
]
}

我的目标是能够为系统和/或指标在其各自数组中存在/不存在的任何实例执行单个更新/插入(使用 upsert=True)。目前我唯一的解决方法是按如下方式更新调用:

if not collection.find_one({"_id": "123", "systems._id": "1338"}):
collection.update(
{"_id": "123"},
{"$addToSet": {"systems": {"_id": "1338"}}},
upsert=True)
collection.update(
{"_id": "123", "systems._id": "1338"},
{"$addToSet": {"systems.$.metrics": "TEST"}},
upsert=True)

谢谢

最佳答案

cannot apply the positional operator without a corresponding query field containing an array ,但您需要位置运算符知道系统数组中的索引以$addToSet {"metrics": ["TEST"]}。也不能根据{"systems._id": "1338"}查询,因为这个字段在文档{"_id": "123"}中可能还不存在>。因此,如果我们不能组合涉及相同字段的多个操作,则不可能在单个请求中完成,但我们不能 have conflicting mods in update .

最后的希望是我们是否有类似于 $where operator 的东西在 update document 语法中允许我们执行任意 JavaScript 来更新文档。我怀疑我们没有(也不会)有这个。

主要问题是 systems 字段上的数组索引。您可以重新设计您的架构以摆脱此索引,使用 _id 属性作为新索引:

{
"_id": "123",
"systems": {
"1338": {
"metrics": [
"TEST"
]
}
}
}

通过这一更改,您可以一次完成所有操作:

db.test.update({_id: "123"}, {$addToSet: {"systems.1338.metrics": "TEST"}}, {upsert: true})

另一种选择是使用以下设计:

{
"_id": "123",
"systems": {
"metrics": {
"1338": [
"TEST"
]
}
}
}

最好的设计取决于您打算做什么。

编辑:

您还可以选择在您的应用程序中本地更新文档,然后将其发送回数据库,但此选项可能无法提供我认为您想要的那种原子性。

关于您当前的解决方法:您不需要 if。您可以按顺序运行这两个查询。但如果您有多个客户端访问您的数据库,这是不安全的。

关于python - 是否可以在同一更新中多次使用 $addToSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16595195/

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