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

5a0*_*01P 6 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
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

San*_*was 11

$addToSet而不是$push.

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

编辑:

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

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

第一步: $pullquizzes数组中输出子文档"wk": 7.0.(如果找不到匹配的子文档,则没有任何反应).

db.push.update(
    { _id: 5 },
    { $pull: { "quizzes": { "wk": 7.0 } } }
)
Run Code Online (Sandbox Code Playgroud)

第2步: $addToSet子文档.

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

您可以使用以下命令组合上述两个更新命令 bulk.find().update()