如何在MongoDB中清除集合中的嵌套数组?

时间:2014-10-14 10:27:30

标签: c# mongodb collections updates

我使用MongoDB C#驱动程序,我想知道如何使用更新查询清除MongoDB中的嵌套数组。

这是我的集合,其中包含以下"架构":

之后的一些文档
{
   "_id": { "$oid": "543cd94799c3ff7a2850a1b6" },
   "Type": 1,
   "Information": [
     {
       "Type" : 2,
       "Colors": [],
       "Heights": [],
       "Widths": []
     }
   ]
}

我想要的是清除(删除所有元素)颜色,高度和宽度嵌套数组。

我尝试过类似的事情:

var query = Query.And(Query.Exists(Entity.INFORMATION + "." + Information.COLORS),
                      Query.Exists(Entity.INFORMATION + "." + Information.HEIGHTS),
                      Query.Exists(Entity.INFORMATION + "." + Information.WIDTHS), 
                      Query.EQ(Entity.TYPE, typeId),
                      Query.ElemMatch(Entity.INFORMATION, Query.EQ(Information.TYPE, informationTypeId)));

var update = MongoDB.Driver.Builders.Update.Set(Entity.INFORMATION + ".$." + Information.WIDTHS, new BsonArray(new Width[0]))
                                           .Set(Entity.INFORMATION + ".$." + Information.COLORS, new BsonArray(new Color[0]))
                                           .Set(Entity.INFORMATION + ".$." + Information.HEIGHTS, new BsonArray(new Height[0]))
                                           .Set(Entity.INFORMATION + ".$." + Information.TYPE, BsonNull.Value);

Collection.Update(query, update, UpdateFlags.Multi);

但似乎没有用。

请帮忙。


我已尝试过以下原生查询,但似乎无效:

db.myCollection.update(
{
  "Information.Colors": {
    $exists: true
  },
  "Type": 1
},
{
  $set: {
    "Information.$.Colors": [],
    "Information.$.Widths": [],
    "Information.$.Heights": [],
    "Information.$.Type" : null
 }
},
false, true)

它仅适用于集合中的第一个文档。

其余的不受影响...... :(

2 个答案:

答案 0 :(得分:1)

$对于嵌套数组是必需的,并且查找具有访问更新字段的查询也是必要的

        var update = Update
            .Set("Information.$.Heights", new BsonArray(new int[0]))
            .Set("Information.$.Colors", new BsonArray(new int[0]))
            .Set("Information.$.Widths", new BsonArray(new int[0]));

        var q = Query.Exists("Information.Heights"); // important

        c.Update(q, update, UpdateFlags.Multi);

答案 1 :(得分:0)

无法使用位置运算符更新数组中的所有文档。

请参阅:http://jira.mongodb.org/browse/SERVER-1243