本文介绍了子文件上的Mongoose唯一索引的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个简单的架构:

Let's say I have a simple schema:

var testSchema = new mongoose.Schema({
    map: { type: [ mongoose.Schema.Types.Mixed ], default: [] },
    ...possibly something else
});

现在让我们确保对( _id map._id )是唯一的。

Now let's ensure that pairs (_id, map._id) are unique.

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 。我可以轻松地多次执行以下查询:

The problem is, this index is ignored and I can easily create multiple subdocuments with the same map._id. I can easily execute following query multiple times:

db.maps.update({ _id: ObjectId("some valid id") }, { $push: { map: { '_id': 'asd' } } });

并最终获得以下结果:

{
    "_id": ObjectId("some valid id"),
    "map": [
        {
            "_id": "asd" 
        },
        {
            "_id": "asd" 
        },
        {
            "_id": "asd" 
        }
    ]
}

这里发生了什么?为什么我可以推送冲突的子文档?

What's going on here? Why can I push conflicting subdocuments?

推荐答案

长话短说:Mongo不支持子文档的唯一索引,尽管它允许创建他们......

Long story short: Mongo doesn't support unique indexes for subdocuments, although it allows creating them...

这篇关于子文件上的Mongoose唯一索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-27 06:42