如何在 mongoDB 中切换数组中的元素

das*_*dsa 8 mongodb

ObjectIds在 mongoDB 中有一个字符串数组 ( )。我想切换该数组中的一个元素:如果该元素存在于数组中,则将其删除,否则推送该元素。

例子:

arr = ["5b608c0769698c3990c64ef3","5b608c0769698c3990c64ef4"]
element = ["5b608c0769698c3990c64ef3"]
Run Code Online (Sandbox Code Playgroud)

最终数组:

arr = ["5b608c0769698c3990c64ef4"]
Run Code Online (Sandbox Code Playgroud)

我的用例:

我正在创建一个博客网站,并在博客架构中存储每个喜欢该博客的用户的 ID,以便在向用户显示博客时突出显示喜欢按钮。

pra*_*ad_ 6

如果您要更新文档,则可以在更新中使用管道。但是此功能在 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)