首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在mongoDB中切换数组中的元素

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

Stack Overflow用户
提问于 2018-07-31 16:58:12
回答 2查看 839关注 0票数 9

我在mongoDB中有一个字符串数组(MongoDB)。我想在数组中切换一个元素:如果数组中存在该元素,请删除它,否则就推那个元素。

示例:

代码语言:javascript
复制
arr = ["5b608c0769698c3990c64ef3","5b608c0769698c3990c64ef4"]
element = ["5b608c0769698c3990c64ef3"]

最终数组:

代码语言:javascript
复制
arr = ["5b608c0769698c3990c64ef4"]

我的用例:

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

EN

回答 2

Stack Overflow用户

发布于 2020-06-15 03:39:25

如果要更新文档,则可以在更新中使用管道。但是这个特性可以在MongoDB版本4.2或更高版本中使用。

代码语言:javascript
复制
db.collection.update(
  { },
  [
     { 
          $set: { 
              arr: { 
                  $cond: [ { $in: [ element, "$arr" ] }, 
                           { $setDifference: [ "$arr", [ element ] ] }, 
                           { $concatArrays: [ "$arr", [ element ] ] } 
                  ] 
              }
          }
     }
  ]
)

注意:假设变量element是字符串值的

如果您只是在查询,可以使用以下聚合:

代码语言:javascript
复制
db.collection.aggregate([
     { 
          $addFields: { 
              arr: { 
                  $cond: [ { $in: [ element, "$arr" ] }, 
                           { $setDifference: [ "$arr", [ element ] ] }, 
                           { $concatArrays: [ "$arr", [ element ] ] } 
                  ] 
              }
          }
     }
] )

但是,如果您使用的MongoDB版本早于4.2,那么您可以使用上面的聚合输出来更新文档:

代码语言:javascript
复制
db.collection.aggregate( [
  // aggregation pipeine from above ...
] ).forEach( doc => db.collection.updateOne( { _id: doc._id }, { $set: { arr: doc.arr } } ) )
票数 7
EN

Stack Overflow用户

发布于 2020-06-15 05:54:44

这也许不是最好的解决办法,但很简单。可以使用$addToSet将元素添加到数组中,如果修改了数组,则可以使用nModified进行检查。0表示它已经存在,而1表示您向它添加了新元素。

所以,您使用猫鼬,正如您说的,然后您有一个模型,让我们说Post。我不知道你用的是女巫后端语言,但我会在这里用node.js展示它:

代码语言:javascript
复制
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");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51618537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档