我ObjectIds在 mongoDB 中有一个字符串数组 ( )。我想切换该数组中的一个元素:如果该元素存在于数组中,则将其删除,否则推送该元素。
例子:
arr = ["5b608c0769698c3990c64ef3","5b608c0769698c3990c64ef4"]
element = ["5b608c0769698c3990c64ef3"]
Run Code Online (Sandbox Code Playgroud)
最终数组:
arr = ["5b608c0769698c3990c64ef4"]
Run Code Online (Sandbox Code Playgroud)
我的用例:
我正在创建一个博客网站,并在博客架构中存储每个喜欢该博客的用户的 ID,以便在向用户显示博客时突出显示喜欢按钮。
如果您要更新文档,则可以在更新中使用管道。但是此功能在 MongoDB 4.2 或更高版本中可用。
db.collection.update(
{ },
[
{
$set: {
arr: {
$cond: [ { $in: [ element, "$arr" ] },
{ $setDifference: [ "$arr", [ element ] ] },
{ $concatArrays: [ "$arr", [ element ] ] }
]
}
}
}
]
)
Run Code Online (Sandbox Code Playgroud)
注意:假设变量element是一个字符串值。
如果您只是查询,则可以使用以下聚合:
db.collection.aggregate([
{
$addFields: {
arr: {
$cond: [ { $in: [ element, "$arr" ] },
{ $setDifference: [ "$arr", [ element ] ] },
{ $concatArrays: [ "$arr", [ element ] ] }
]
}
}
}
] )
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用的是 4.2 之前的 MongoDB 版本,那么您可以使用上面的聚合输出来更新文档:
db.collection.aggregate( [
// aggregation pipeine from above ...
] ).forEach( doc => db.collection.updateOne( { _id: doc._id }, { $set: { arr: doc.arr } } ) )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
414 次 |
| 最近记录: |