gpt4 book ai didi

mongodb - 用mongo同时pull和addtoset

转载 作者:IT老高 更新时间:2023-10-28 13:08:25 24 4
gpt4 key购买 nike

我有一个集合,其中的元素可以简化为:

{tags : [1, 5, 8]}

数组中至少有一个元素,并且它们都应该不同。我想用一个标签替换另一个标签,我认为不会有问题。所以我想出了以下查询:

db.colll.update({
tags : 1
},{
$pull: { tags: 1 },
$addToSet: { tags: 2 }
}, {
multi: true
})

很酷,所以它会找到所有具有我不需要的标签的元素 (1),如果它不存在,则将其删除并添加另一个 (2)。问题是我得到一个错误:

"Cannot update 'tags' and 'tags' at the same time"

这基本上意味着我不能同时做 pull 和 addtoset。我还有其他方法可以做到这一点吗?

当然,我可以记住所有元素的 ID,然后删除标签并添加单独的查询,但这听起来不太好。

最佳答案

该错误几乎就是它的含义,因为您无法在同一更新操作中对同一“路径”的两个事物采取行动。您使用的两个运算符不会像您想象的那样按顺序处理。

您可以像使用 "bulk" operations API 一样“顺序”来执行此操作或其他形式的“批量”更新。理所当然,反之亦然:

var bulk = db.coll.initializeOrderedBulkOp();
bulk.find({ "tags": 1 }).updateOne({ "$addToSet": { "tags": 2 } });
bulk.find({ "tags": 1 }).updateOne({ "$pull": { "tags": 1 } });

bulk.execute();

不保证没有其他东西会尝试修改,但它与您目前所获得的一样接近。

另见原始 "update" command包含多个文档。

关于mongodb - 用mongo同时pull和addtoset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24300148/

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