Hãy nói rằng tôi có một giản đồ đơn giản:Mongoose chỉ số duy nhất trên subdocument
var testSchema = new mongoose.Schema({
map: { type: [ mongoose.Schema.Types.Mixed ], default: [] },
...possibly something else
});
Bây giờ chúng ta hãy đảm bảo rằng cặp (_id
, map._id
) là duy nhất.
testSchema.index({ _id: 1, 'map._id': 1 }, { unique: true });
Kiểm tra nhanh bằng cách sử dụng db.test.getIndexes()
cho biết rằng nó đã được tạo.
{
"v" : 1,
"unique" : true,
"key" : {
"_id" : 1,
"map._id" : 1
},
"name" : "_id_1_map._id_1",
"ns" : "test.test",
"background" : true,
"safe" : null
}
Vấn đề là, chỉ mục này bị bỏ qua và tôi có thể dễ dàng tạo nhiều subdocuments với cùng một map._id
. Tôi có thể dễ dàng thực hiện truy vấn sau nhiều lần:
db.maps.update({ _id: ObjectId("some valid id") }, { $push: { map: { '_id': 'asd' } } });
và kết thúc với sau:
{
"_id": ObjectId("some valid id"),
"map": [
{
"_id": "asd"
},
{
"_id": "asd"
},
{
"_id": "asd"
}
]
}
gì đang xảy ra ở đây? Tại sao tôi có thể đẩy các phân mục phụ xung đột?
Có thể có hai mặt của http://stackoverflow.com/questions/13907257/validating-uniqueness-of-an-embedded-document-scoped-by-its-parent-in-mongoose – JohnnyHK
Thực tiễn không tốt để sử dụng bất kỳ thứ gì khác so với ObjectId cho '_id'. Tại sao bạn muốn làm điều đó? –