Diciamo che ho un semplice schema:Mongoose indice univoco sul documento secondario
var testSchema = new mongoose.Schema({
map: { type: [ mongoose.Schema.Types.Mixed ], default: [] },
...possibly something else
});
Ora cerchiamo di assicurare che le coppie (_id
, map._id
) sono uniche.
testSchema.index({ _id: 1, 'map._id': 1 }, { unique: true });
Controllo rapido tramite db.test.getIndexes()
indica che è stato creato.
{
"v" : 1,
"unique" : true,
"key" : {
"_id" : 1,
"map._id" : 1
},
"name" : "_id_1_map._id_1",
"ns" : "test.test",
"background" : true,
"safe" : null
}
Il problema è, questo indice viene ignorato e posso facilmente creare più documenti secondari con la stessa map._id
. Posso facilmente eseguire query seguente più volte:
db.maps.update({ _id: ObjectId("some valid id") }, { $push: { map: { '_id': 'asd' } } });
e finire con seguente:
{
"_id": ObjectId("some valid id"),
"map": [
{
"_id": "asd"
},
{
"_id": "asd"
},
{
"_id": "asd"
}
]
}
cosa sta succedendo qui? Perché posso inviare documenti secondari in conflitto?
Possibile dupe di http://stackoverflow.com/questions/13907257/validating-uniqueness-of-an-embedded-document-scoped-by-its-parent-in-mongoose – JohnnyHK
È una cattiva pratica usare qualsiasi altra cosa di ObjectId per '_id'. Perché vorresti farlo? –