使用应用于 MongoDB 中的更改流的聚合阶段从子数组中删除元素?
Remove element from subarray using an aggregation stage applied to a change stream in MongoDB?
我正在使用 MongoDB 4.2,我正在寻找一种方法,如果它不符合特定条件,则使用与 [= 兼容的聚合阶段从子数组中删除所有元素14=] 是:
- $addFields
- $匹配
- $项目
- $replaceRoot
- $replaceWith
- $redact
- $套
- $未设置
例如,假设我们有一个集合 users,其中包含以下格式的文档:
{ "name" : "John Doe",
"access": [
{ "level" : "Gold", "rating" : 3.2 },
{ "level" : "Silver", "rating" : 2.1 },
{ "level" : "Gold", "rating" : 4.2 }
]
}
我想使用一个或多个兼容的聚合阶段来删除“访问”数组中与 { $elemMatch : { "level" : "Gold" } }
等过滤器不匹配的元素。我希望生成的文档看起来像这样:
{ "name" : "John Doe",
"access": [
{ "level" : "Gold", "rating" : 3.2 },
{ "level" : "Gold", "rating" : 4.2 }
]
}
是否可以在 MongoDB 中执行此操作?
您可以将 $addFields
/ $set
与 $filter
一起使用
db.collection.aggregate({
$set: {
access: {
$filter: {
input: "$access",
cond: { $eq: ["$$this.level", "Gold"] } // your condition expression
}
}
}
})
如果您想更新 现有文档,您可以使用更新管道执行此操作,如下所示
db.test.updateMany({
access: { $elemMatch: { level: { $ne: "Gold" } } }, // find elements that does not match your condition
[{
$set: {
access: {
$filter: {
input: "$access",
cond: { $eq: ["$$this.level", "Gold"] } // your condition expression
}
}
}
}]
)
我正在使用 MongoDB 4.2,我正在寻找一种方法,如果它不符合特定条件,则使用与 [= 兼容的聚合阶段从子数组中删除所有元素14=] 是:
- $addFields
- $匹配
- $项目
- $replaceRoot
- $replaceWith
- $redact
- $套
- $未设置
例如,假设我们有一个集合 users,其中包含以下格式的文档:
{ "name" : "John Doe",
"access": [
{ "level" : "Gold", "rating" : 3.2 },
{ "level" : "Silver", "rating" : 2.1 },
{ "level" : "Gold", "rating" : 4.2 }
]
}
我想使用一个或多个兼容的聚合阶段来删除“访问”数组中与 { $elemMatch : { "level" : "Gold" } }
等过滤器不匹配的元素。我希望生成的文档看起来像这样:
{ "name" : "John Doe",
"access": [
{ "level" : "Gold", "rating" : 3.2 },
{ "level" : "Gold", "rating" : 4.2 }
]
}
是否可以在 MongoDB 中执行此操作?
您可以将 $addFields
/ $set
与 $filter
db.collection.aggregate({
$set: {
access: {
$filter: {
input: "$access",
cond: { $eq: ["$$this.level", "Gold"] } // your condition expression
}
}
}
})
如果您想更新 现有文档,您可以使用更新管道执行此操作,如下所示
db.test.updateMany({
access: { $elemMatch: { level: { $ne: "Gold" } } }, // find elements that does not match your condition
[{
$set: {
access: {
$filter: {
input: "$access",
cond: { $eq: ["$$this.level", "Gold"] } // your condition expression
}
}
}
}]
)