我的文档示例:
{
id: 139234234,
count: 12,
type: apple,
buyer: [
{name: "peter", price: 1.23, max: 129},
{name: "alex", price: 1.4, "max": 12146}
]
}
字符串
我的更新:
db.updateMany({ id: 139234234 }, [
{
$set: {
buyer: {
$concatArrays: [
{
$filter: {
input: "$buyer",
cond: {
{ $ne: ["$$this.name", "john"] },
},
},
},
[
{
name: "john",
price: 12,
max: 234,
},
],
],
},
},
},
]);
型
我经常在buyer
字段中进行这种更新,如果我希望任何更新不包括buyer
,我应该为更改流管道(db.collection.watch(changeStreamPipeline)
)写什么。例如:当前更新描述
updateDescription: {
updatedFields: {
'buyer.2.name': "alex",
'buyer.2.price': 1.4,
'buyer.2.max': 12146,
}}
型
我不想收到任何以buyer
开头的updateFields
的消息,例如:buyer.2.name
,buyer.2.price
。我尝试了以下管道,但它只适用于确切为buyer
的更新字段:
db.collection.watch(
[
{
$match: {
operationType: "update",
"updateDescription.updatedFields.buyer": {
$exists: false
}
}
}
]
)
型
1条答案
按热度按时间13z8s7eq1#
你可以做的是在
$match
阶段之前添加一个$addFields
阶段,在这个阶段中,我们将在执行匹配阶段之前从对象中删除所有“buyer”键,以查看是否有任何其他字段被更新,下面是我如何使用
$objectToArray
和$regexMatch
做到这一点:字符串