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

时间:2018-07-31 16:58:13

标签: mongodb

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

示例:

CustomObjectWrapper

最终数组:

ObjectIds

我的用例:

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

2 个答案:

答案 0 :(得分:5)

如果要更新文档,则可以使用 update 中的管道。但是此功能在MongoDB 4.2或更高版本中可用。

db.collection.update(
  { },
  [
     { 
          $set: { 
              arr: { 
                  $cond: [ { $in: [ element, "$arr" ] }, 
                           { $setDifference: [ "$arr", [ element ] ] }, 
                           { $concatArrays: [ "$arr", [ element ] ] } 
                  ] 
              }
          }
     }
  ]
)

注意::假设变量element string 值。

如果您只是查询,则可以使用以下汇总:

db.collection.aggregate([
     { 
          $addFields: { 
              arr: { 
                  $cond: [ { $in: [ element, "$arr" ] }, 
                           { $setDifference: [ "$arr", [ element ] ] }, 
                           { $concatArrays: [ "$arr", [ element ] ] } 
                  ] 
              }
          }
     }
] )

但是,如果您使用的MongoDB版本早于4.2,则可以使用上面的汇总输出来更新文档:

db.collection.aggregate( [
  // aggregation pipeine from above ...
] ).forEach( doc => db.collection.updateOne( { _id: doc._id }, { $set: { arr: doc.arr } } ) )

答案 1 :(得分:1)

它可能不是最佳解决方案,但是很简单。您可以使用$addToSet将元素添加到数组,并使用nModified检查是否修改了数组。 0表示该元素已经存在,1表示您已向其中添加新元素。

因此,您按您所说的使用猫鼬,那么您有一个模型,可以说Post。我不知道您使用的女巫后端语言,但是我将在这里用node.js展示它:

let result = await Post.updateOne({ _id: "someId" }, { 
   $addToSet: {
      arr: element
   }
})

if(result.nModified === 0){
   //0 means, no modifikation, that means its already liked
   await Post.updateOne({ _id: "someId" }, {
      $pull: {
         arr: element
      }
   })
}
response.send("Done");