更新数组中的元素如果存在,则在MongoDb中的该数组中插入新元素

时间:2017-01-27 06:47:05

标签: arrays mongodb

我在MongoDB中有一组元素数组,如下所示:

{ 
    "_id" : 5, 
    "quizzes" : [
        {
            "wk" : 1, 
            "score" : 10
        }, 
        {
            "wk" : 2, 
            "score" : 8
        }, 
        {
            "wk" : 3, 
            "score" : 5
        }
      ], 
    "play" : [
        {
            "wk" : 2, 
            "score" : 8
        }, 
        {
            "wk" : 3, 
            "score" : 5
        }
    ]
}

我正在尝试在数组中插入新记录(如果不存在),如果该数组中存在记录,则更新该数组记录。 下面是我的MongoDB查询。

db.push.update(
    { _id: 5 },
    { $push: { "quizzes": {"wk" : 6.0,"score" : 8.0},"play": {"wk" : 6.0,"score" : 8.0}  } }
)

每当我执行此查询时,它会在数组中插入新记录,但我想如果记录存在则更新该数组。

2 个答案:

答案 0 :(得分:8)

使用$addToSet代替$push

db.push.update(
    { _id: 5 },
    { $addToSet: { "quizzes": {"wk": 6.0, "score": 8.0}, "play": {"wk": 6.0, "score": 8.0} } }
)

修改

对于特定属性,数组字段中的条件子文档更新没有简单的内置方法。但是,一个小技巧可以通过顺序执行两个命令来完成这项工作。

例如:如果我们想要使用对象quizzes更新{ "wk": 7.0, "score": 8.0 }字段,我们可以分两步完成:

步骤1: $pull quizzes数组"wk": 7.0中的子文档。 (如果未找到匹配的子文档,则不会发生任何事情。)

db.push.update(
    { _id: 5 },
    { $pull: { "quizzes": { "wk": 7.0 } } }
)

步骤2: $addToSet子文档。

db.push.update(
    { _id: 5 },
    { $addToSet: { "quizzes": {"wk": 7.0, "score": 8.0} } }
)

您可以使用bulk.find().update()

组合上述两个更新命令

答案 1 :(得分:0)

我想你想做的是, 根据相同元素的不同属性值,将属性添加到数组的元素。

您可以将updateOne()函数与$(update)运算符一起使用,请参阅文档mongodb documentation for $(update)

假设您要向wk值为1的数组元素添加一个属性描述(假设其基于您提供的键某种形式)

输入:问题中给出的数据收集。

Mongo命令:

db.<your_collection_name>.updateOne(
{
 "_id":5,
   "quizzes.wk":1
  },
  {
   $set:{
    "quizzes.$.description":"I am a new property"
  }
});

输出:

{
        "_id" : 5,
        "quizzes" : [
                {
                        "wk" : 1,
                        "score" : 10,
                        "description" : "I am a new property"
                },
                {
                        "wk" : 2,
                        "score" : 8
                },
                {
                        "wk" : 3,
                        "score" : 5
                }
        ],
        "play" : [
                {
                        "wk" : 2,
                        "score" : 8
                },
                {
                        "wk" : 3,
                        "score" : 5
                }
        ]
}

注意:它将仅更改数组的一个条目,即第一个匹配的条目。