如何删除mongoDB中具有索引的数组元素?

时间:2013-12-11 18:27:15

标签: mongodb

该文件如下所示,

{
"_id":"ffffff999999999f9ff9f9f9f",
 "Name" : "John Doe",
  "Array" : [{
      "Id1" : "a8ed3d86b8464e0cae4672cef3862860",
      "Id2" : "6d7aac14b1e142abafde167d928e3dbc",
      "Id3" : "2323232"
    }]
}

3个数组元素的组合有唯一性索引。 所以索引看起来像这样,

        "key" : {
                "Array.Id1" : 1,
                "Array.Id2" : 1,
                "Array.Id3" : 1
        },
        "unique" : true,

我的要求:我想找到基于“_id”值的文档并完全删除数组元素。

问题: 我正在尝试这样的事情,

db.Collection.update({"_id":"ffffffff52a8a15ce4b05d6a8d40f973"},{$unset:{Array:1}})

当我尝试取消设置数组元素时,第一次更新会通过但是连续的更新失败并出现以下错误,

* E11000重复键错误索引:int.Collection。$ Array.Id1_1_Array.Id2_1_Array.Id3_1 dup key:{:null,:null,:null} *

我想知道这个问题是否有任何解决方法。

我必须在庞大的集合上运行它,并且修改索引不是一种选择。

任何建议都会有很大帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

唯一索引以这种方式工作。您不能在索引字段上复制甚至空值(或保留未定义)。 但是sparse选项允许您实现此目的。

用法:db.collection.ensureIndex( { a: 1 }, { unique: true, sparse: true } )

因此,如果您要使用unset数组,则可能需要使用稀疏选项重新编制索引。

Warning: Using these indexes will sometimes result in incomplete results 
when filtering or sorting results, because sparse indexes are not complete 
for all documents in a collection.

答案 1 :(得分:0)

正如这个最小的例子所示,从一开始就不可能多次设置一个唯一索引字段 - 这个问题不仅发生在你以后尝试取消设置时。

> db.coll.ensureIndex({indexField:1}, {unique: true})
> db.coll.insert({name: "doc without index field 1"})
> db.coll.insert({name: "doc without index field 2"})
E11000 duplicate key error index: test.coll.$indexField_1  dup key: { : null }

你必须用其他东西替换该字段 - 不一定是数组,但它必须是唯一的......