MongoDB:更新嵌套数组元素,如果不存在则插入它

时间:2016-10-20 11:57:55

标签: javascript mongodb meteor minimongo

这就是我的案例中的文档结构:

{
    "_id" : "P9H59RuSbnm45erj7",
    "description" : [
        {
            "content" : "Something",
            "language" : "en",
            "timestamp" : 1476958705
        },
        {
            "content" : "Irgendetwas",
            "language" : "de",
            "timestamp" : 1476958705
        }
    ]
}

现在我想更新特定语言的内容。 描述数组可能缺少语言。

{
    "_id" : "P9H59RuSbnm45erj7",
    "description" : [
        {
            "content" : "Something",
            "language" : "en",
            "timestamp" : 1476958705
        }
    ]
}

所以我要做的是首先检查语言是否存在,然后

  1. 如果它存在,我会做一个简单的更新/ $ set
  2. 如果不存在,我会进行更新/ $ addToSet
  3. 我的问题是,如果这可以简化。我是否真的必须检查现有语言,然后使用两个不同的更新查询?有了这个,代码就会被提升......

    我在我的流星应用程序中使用此代码,因此我使用了minimongo。

    if (Collection.find({ _id: 'P9H59RuSbnm45erj7', 'description.language': 'en' }).count() > 0) {
        Collection.update(
            {
                _id                   : 'P9H59RuSbnm45erj7',
                'description.language': 'en'
            },
            {
                $set: {
                    'description.$.content'  : value,
                    'description.$.timestamp': Math.floor(Date.now() / 1000)
                }
            }
        );
    }
    else {
        Collection.update(
            { _id: 'P9H59RuSbnm45erj7' },
            {
                $addToSet: {
                    description: {
                        content  : value,
                        language : 'en',
                        timestamp: Math.floor(Date.now() / 1000)
                    }
                }
            }
        );
    }
    

1 个答案:

答案 0 :(得分:1)

db.Test8.update(
      { _id: 1, "description.language":{$eq:"en"} },
      {
                $set: { "description.$.content": "content5" }
      },
      {}, function (err, result) {

          // if result.nMatched == 0 then make your $addToSet
          // because there are no query

       }
    );

在此查询中获得的好处是大部分时间都是1次查询而不是2次。并且很少有时间进行2次查询。

取决于您最常见的情况。 正如您所说,大部分时间都是更新,那么您可以进行1次查询而不是2次查询。

我不知道如何改善它。