【问题标题】:Using Mongoose / MongoDB $addToSet functionality on array of objects在对象数组上使用 Mongoose / MongoDB $addToSet 功能
【发布时间】:2016-02-08 03:45:45
【问题描述】:

假设我在 Mongoose 架构上有这个数组属性('articles'):

articles: [ 

 {
  kind: 'bear',
  hashtag: 'foo'    
 },

 {
  kind: 'llama',
  hashtag: 'baz',
  },

 {
  kind: 'sheep',
  hashtag: 'bar',
  }

]

如何使用

$addToSet https://docs.mongodb.org/manual/reference/operator/update/addToSet/

通过检查 hashtag 的值来添加到这个数组中,看看它是否是唯一的?

例如,如果我想将以下对象添加到上述数组中,我希望 Mongo 将其作为重复项“拒绝”:

{
  kind: 'tortoise',
  hashtag: 'foo'

}

因为 hashtag=foo 已经被占用了。

问题是我只知道如何将$addToSet 与简单的整数数组一起使用...

例如,如果文章看起来像这样:

articles: [ 1 , 5 , 4, 2]

我会像这样使用 $addToSet:

var data = {

    "$addToSet": {
     "articles": 9
   }

}

model.update(data);

但是如何使用唯一字段是字符串(在本例中为“hashtag”)的对象数组来完成相同的操作?文档没有说明这一点,似乎我到处都搜索过..

谢谢

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    您需要使用$ne 运算符。

    var data = { 'kind': 'tortoise', 'hashtag': 'foo' };
    Model.update(
        { 'articles.hashtag': { '$ne': 'foo' } }, 
        { '$addToSet': { 'articles': data } }
    )
    

    仅当“article”数组中没有标签值为“foo”的子文档时才会更新文档。

    正如评论中提到的@BlakesSeven

    一旦您测试其中一个值是否存在,$addToSet 就变得无关紧要,因此为了代码清晰,这也可能是$push。但是这个原理是正确的,因为$addToSet 作用于整个对象,而不仅仅是它的一部分。

    Model.update({ 
        { 'articles.hashtag': { '$ne': 'foo' } }, 
        { '$push': {'articles':  data } }
    )
    

    【讨论】:

    • 如果对象包含“_id”字段怎么办?它仍然需要'$ne'运算符来检查重复性吗?
    • @PavanVora,你可以在过滤器中{'articles.hastag': {'$ne': 'cats'}, 'articles.kind': {'$ne': 'struct'}}
    • 谢谢@styvane :) 感谢您的回复。
    【解决方案2】:
    // add the comment's id to the commentsList : 
                            // share.comments.commentsList.addToSet(callback._id);
                            share.update(
                                { '$push': {'comments.commentsList':  mongoose.Types.ObjectId(callback._id) } }
                            , function(){
                                console.log('added comment id to the commentsList array of obectIds')
                            })
    

    【讨论】:

      猜你喜欢
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 2021-11-04
      相关资源
      最近更新 更多