你能在有一系列更新操作的MongoDB Bulk Write中执行$pull吗



版本:MongoDB v 4.2.18。

我有以下MongoDb脚本,我正试图在MongoDb Shell中运行:

const operations = [ {

"updateOne" : {
"filter" : { <snipped> },
"update" : [
{ "$pull" : { <snipped> } },
{ "$set" : { <snipped> } }
]
}
} ]
db.accounts.bulkWrite(operations);
  • 我已经剪下了过滤器、pull和set的模式。我以前在单次手术中使用过它们,它们100%效果良好
  • 当你有一系列操作时,BulkWrite是很好的。这个例子有一个原子操作。为了简化这个问题,我刚刚删除了其他项目。所以请不要说";不要使用BW,只需执行一个普通的Update查询即可

shell基本上错误为:

WriteCommandError({
"ok" : 0,
"errmsg" : "Unrecognized pipeline stage name: '$pull'",
"code" : 40324,
"codeName" : "Location40324"
})

那么,你能在有一系列更新操作的MongoDB Bulk Write中执行$pull吗?

顺便说一句,这是有效的,如果我:

  • 不执行2次原子操作,只执行一次
  • 不要执行一系列操作
const operations = [ {

"updateOne" : {
"filter" : { <snipped> },
"update" : { "$pull" : { <snipped> } }
}
} ]

最后,我在官方文档中找到了一些关于$pull和bulkWrite的信息,但他们给出的示例只有一个操作,而不是一系列操作。如上所述,如果我有一个单独的操作(如示例(,我可以让它工作。但我不能用数组:(

您用于更新的语法是聚合管道更新snytax,这意味着您正在执行一个有限的"聚合流水线";作为您的更新主体。

$pull不是聚合表达式,这意味着它不能在聚合管道中使用。$set对您有效,因为它确实有聚合版本。

因此,如果你想保持当前的逻辑,我们只需要使用一个聚合运算符,它可以做$pull可以做的事情,特别是$filter运算符似乎很适合:

const operations = [
{
"updateOne": {
"filter": {},
"update": [
{
"$set": {
arrayYouPullFrom: {
$filter: {
$input: "$arrayYouPullFrom",
cond: {$ne: ["$$this", "valueToPull"]}
}
}
}
},
{"$set": {}}
]
}
}
]
db.accounts.bulkWrite(operations);

最新更新