该文件如下所示,
{
"_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} *
我想知道这个问题是否有任何解决方法。
我必须在庞大的集合上运行它,并且修改索引不是一种选择。
任何建议都会有很大帮助。
感谢。
答案 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 }
你必须用其他东西替换该字段 - 不一定是数组,但它必须是唯一的......