关于JSON数组的mongodb更新

Sum*_*eet 0 javascript mongodb nosql node.js

我在Mongo中有这些数据:

{'_id':1,
             'name':'Root',
             'taskId':1,
             'parentId':"",
             'path':[1],
             'tasks':[  {"taskId":3,parentId:1,name:'A',type:'task'},
                        {"taskId":4,parentId:1,name:'D',type:'task'},
                        {"taskId":5,parentId:4,name:'B',type:'task'},
                        {'type':'project' , 'proRef':2},
                        {"taskId":6,parentId:3,name:'E',type:'task'},
                        {"taskId":7,parentId:6,name:'C',type:'task'}]

            }
Run Code Online (Sandbox Code Playgroud)

现在我想用新的Json数据更新taskId 6.

var jsonData = {"taskId":6,"name":'Sumeet','newField1':'Val1','newField2':'Val2'}
Run Code Online (Sandbox Code Playgroud)

如果字段可用,则查询应更新,否则将新密钥添加到现有.Output Like

{"taskId":6,parentId:3,name:'Sumeet',type:'task','newField1':'Val1','newField2':'Val2'}]
Run Code Online (Sandbox Code Playgroud)

我尝试了很少的查询,但它完全取代了json.

 db.projectPlan.update({_id:1,'tasks.taskId':6},{$set :{'tasks.$':jsonData }});
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!Sumeet

Asy*_*sky 5

您需要将jsonData变量转换为可以传递给更新的内容.这是一个与您的示例文档完全相同的示例:

var updateData = {};
for (f in jsonData) {
    if (f != "taskId") updateData["tasks.$."+f]=jsonData[f]; 
};
db.projectPlan.update({_id:1, 'tasks.taskId':6}, {$set:updateData})
Run Code Online (Sandbox Code Playgroud)

结果:

{ "_id" : 1, 
  "name" : "Root",
  "taskId" : 1,
  "parentId" : "",
  "path" : [  1 ],
  "tasks" : [
    {   "taskId" : 3,   "parentId" : 1,     "name" : "A",   "type" : "task" },
    {   "taskId" : 4,   "parentId" : 1,     "name" : "D",   "type" : "task" },
    {   "taskId" : 5,   "parentId" : 4,     "name" : "B",   "type" : "task" },
    {   "type" : "project",     "proRef" : 2 },
    {   "taskId" : 6,   "parentId" : 3,     "name" : "Sumeet",  "type" : "task",    "newField1" : "Val1",   "newField2" : "Val2" },
    {   "taskId" : 7,   "parentId" : 6,     "name" : "C",   "type" : "task" } 
] }
Run Code Online (Sandbox Code Playgroud)