【发布时间】:2014-11-12 22:19:30
【问题描述】:
假设我有一个简单的架构:
var testSchema = new mongoose.Schema({
map: { type: [ mongoose.Schema.Types.Mixed ], default: [] },
...possibly something else
});
现在让我们确保对(_id、map._id)是唯一的。
testSchema.index({ _id: 1, 'map._id': 1 }, { unique: true });
使用db.test.getIndexes() 快速检查表明它已创建。
{
"v" : 1,
"unique" : true,
"key" : {
"_id" : 1,
"map._id" : 1
},
"name" : "_id_1_map._id_1",
"ns" : "test.test",
"background" : true,
"safe" : null
}
问题是,这个索引被忽略了,我可以很容易地创建多个具有相同map._id 的子文档。我可以轻松地多次执行以下查询:
db.maps.update({ _id: ObjectId("some valid id") }, { $push: { map: { '_id': 'asd' } } });
最终得到以下结果:
{
"_id": ObjectId("some valid id"),
"map": [
{
"_id": "asd"
},
{
"_id": "asd"
},
{
"_id": "asd"
}
]
}
这里发生了什么?为什么我可以推送冲突的子文档?
【问题讨论】:
-
对
_id使用除 ObjectId 以外的任何内容都是不好的做法。你为什么要这样做?