从数组数组中删除元素:MongoDB

时间:2015-04-07 17:36:43

标签: mongodb

{
    "_id" : "TestData123",
    "data" : [ 
        {
            "ch" : "test1",
            "prod" : [ 
                {
                    "sid" : "1",
                    "value" : " TV"
                }, 
                {
                    "sid" : "2",
                    "value" : "amazon",
                }, 
                {
                    "sid" : "3",
                    "value" : "ebay",
                }, 
                {
                    "sid" : "4",
                    "value" : "otherthing",
                }
            ]
        }, 
        {
            "ch" : "test2",
            "prod" : [ 
                {
                    "sid" : "6",
                    "value" : "TV",
                }, 
                {
                    "sid" : "7",
                    "value" : "amazon",
                }, 
                {
                    "sid" : "8",
                    "value" : "ebay",
                }, 
                {
                    "sid" : "9",
                    "value" : "otherthing",
                }
            ]
        }
    ]
}

我有以上格式的mongoDB集合。 我需要移除/清空阵列' prod'在ch:test1和ch:test2。 另外,请建议mongo查询以便将元素添加到这些中。

2 个答案:

答案 0 :(得分:1)

我已经清理并格式化了您的BSON对象:

{
   "_id":"TestData123",
   "data":[
      {
         "ch":"test1",
         "prod":[
            {
               "sid":"1",
               "value":" TV"
            },
            {
               "sid":"2",
               "value":"amazon"
            },
            {
               "sid":"3",
               "value":"ebay"
            },
            {
               "sid":"4",
               "value":"otherthing"
            }
         ]
      },
      {
         "ch":"test2",
         "prod":[
            {
               "sid":"6",
               "value":"TV"
            },
            {
               "sid":"7",
               "value":"amazon"
            },
            {
               "sid":"8",
               "value":"ebay"
            },
            {
               "sid":"9",
               "value":"otherthing"
            }
         ]
      }
   ]
}

这是另一个具有相同问题的stackoverflow帖子:

https://stackoverflow.com/a/6327971/980423

您正在寻找$unset运营商。

  db.tmp.update({"_id":"TestData123", "data.ch": "test1"}, {$unset: {"data.$.prod": 1}});

它也很棘手,因为它在一个数组中。

  db.tmp.update({"_id":"TestData123", "data.ch": "test1"}, {$set: {"data.$.prod": <some array>}});

将再次设置它。

答案 1 :(得分:0)

我不确定你使用的语言是什么,但这是我在C#中的表现方式。我会先得到带有id的文件。

var dbcollection = db.GetCollection("");
var document = dbcollection.FindOneById(ObjectId.Parse(id));
var query = new QueryDocument { { "_id", ObjectId.Parse(id) } };

然后我会用修改后的版本更新文档。

BsonArray array = new BsonArray(); //leave empty or add same structure but empty fields
UpdateBuilder update = new UpdateBuilder();
update.Set("data.0.prod", array );
var result = dbcollection.Update(query, update);

这将清空数组。我没有清空一个数组,我刚刚更新了一个,但我认为这样可行。

这也可行,我还没有测试过。

dbcollection.Remove(Query.EQ("_id", ObjectId.Parse(id)), document["data"][0]["prod"] );