基于跨多个文档的字段更新多个数组元素

时间:2014-11-07 21:05:29

标签: mongodb mongodb-.net-driver

我有一个包含文档的集合,每个文档都包含一个子文档数组。给定一个新的子文档数组与这些文档中的数组字段具有相同的结构,我想基于我的新数组中的项的id字段替换我的集合中的文档中的所有数组元素,无论其值是什么元素是。

换句话说,我想通过它们的id字段查询集合中的数组元素,并用新数组中匹配id字段的数组元素替换它们。

示例:

收藏:

{
 _id: "Document1",
 array: 
 [ 
   {id: 1, field2: "A", field3: "W"}, 
   {id: 2, field2: "B", field3: "X"}, 
   {id: 3, field2: "C", field3: "Y"}
 ]
},

{
 _id: "Document2",
 array: 
 [ 
   {id: 1, field2: "A", field3: "E"}, 
   {id: 2, field2: "B", field3: "F"}, 
   {id: 3, field2: "C", field3: "G"},
   {id: 4, field2: "D", field3: "H"}
 ]
},

{
 _id: "Document3",
 array: 
 [ 
   {id: 1, field2: "A", field3: "R"}, 
   {id: 2, field2: "B", field3: "S"}
 ]
}

新数组(包含要实施的更改):

 [
   {id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"}, 
   {id: 3, field2: "FIELD2_ANOTHER_UPDATE", field3: "FIELD3_ANOTHER_UPDATE"}
 ]

这应该产生以下更新的集合:

{
 name: "Document1",
 array: 
 [ 
   {id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"}, 
   {id: 2, field2: "B", field3: "X"}, 
   {id: 3, field2: "FIELD2_ANOTHER_UPDATE", field3: "FIELD3_ANOTHER_UPDATE"}
 ]
},

{
 name: "Document2",
 array: 
 [ 
   {id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"}, 
   {id: 2, field2: "B", field3: "F"}, 
   {id: 3, field2: "FIELD2_ANOTHER_UPDATE", field3: "FIELD3_ANOTHER_UPDATE"},
   {id: 4, field2: "D", field3: "H"}
 ]
},

{
 name: "Document3",
 array: 
 [ 
   {id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"}, 
   {id: 2, field2: "B", field3: "S"}
 ]
}

注意:包含新值的新数组将包含与每个文档的数组完全相同的字段。我想在id匹配的地方完全替换数组元素。

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解你的观点。 如果这个代码是您的答案,那么c#代码应该易于实现

db.test.update( 
{
    'array.id' : { $in : [1, 3]} 
},
{
    $set : 
    {        
        "array.0" : {id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"}, 
        "array.2" : {id: 3, field2: "FIELD2_ANOTHER_UPDATE", field3: "FIELD3_ANOTHER_UPDATE"}
    }
},
{
     upsert: false,
     multi: true,     
}
);

<强>更新 解决方案不是一个非常简单的更新查询,但它工作正常:

var toBeUpdate = [
   {id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"}, 
   {id: 3, field2: "FIELD2_ANOTHER_UPDATE", field3: "FIELD3_ANOTHER_UPDATE"}
 ];

db.test.find().forEach(function (item)
   {
       var array = item.array;
       for(var index = 0; index < array.length; index++)
       {           
           for(var index2 = 0; index2 < toBeUpdate.length; index2++)
           {               
               if(array[index].id == toBeUpdate[index2].id)
               {                   
                   if(toBeUpdate[index2].field1 != undefined) array[index].field1 = toBeUpdate[index2].field1;
                   if(toBeUpdate[index2].field2 != undefined) array[index].field2 = toBeUpdate[index2].field2;
                   if(toBeUpdate[index2].field3 != undefined) array[index].field3 = toBeUpdate[index2].field3;
                   break;
               }
           }
       }

      db.test.update({'_id' : item._id}, item);      
   }
)