Mongodb 不遵守日期的唯一复合索引
Mongodb unique compound index not honoring Dates
我在使用 mongodb 中的唯一复合索引时遇到问题。代码最能说明问题(在 mongo shell 中):
var collection = db.getCollection('test');
collection.drop(); // start from scratch
collection.createIndex({date:1});
collection.createIndex({_id:1, date:1}, {unique: true});
var doc1 = {_id: NumberInt(1), date: new ISODate('2015-04-27 00:00:00.000Z')};
var doc2 = {_id: NumberInt(1), date: new ISODate('2015-04-28 00:00:00.000Z')};
collection.insert(doc1);
collection.insert(doc2);
我希望 doc2 可以正常插入,因为即使它的 _id 是 1,它的日期也不同,但是脚本 returns 这个错误:
E11000 duplicate key error index: db.test.$_id_ dup key: { : 1 }
当我对集合执行 find() 时,我实际上只看到:
{ "_id" : 1, "date" : ISODate("2015-04-27T00:00:00.000Z") }
为什么这不起作用?
您不能在唯一复合索引中使用 _id,因为 _id 在 MongoDB 中默认用作唯一键本身。使用 id:
而不是 _id
collection.createIndex({id:1, date:1}, {unique: true});
var doc1 = {id: NumberInt(1), date: new ISODate('2015-04-27 00:00:00.000Z')};
var doc2 = {id: NumberInt(1), date: new ISODate('2015-04-28 00:00:00.000Z')};
它不起作用,因为您对 _id
使用相同的值,它本身具有唯一约束。
为什么不使用这样的东西,它可以为您节省一个索引:
{
_id: {
docid: new ObjectId(),
date: new ISODate()
}
}
我在使用 mongodb 中的唯一复合索引时遇到问题。代码最能说明问题(在 mongo shell 中):
var collection = db.getCollection('test');
collection.drop(); // start from scratch
collection.createIndex({date:1});
collection.createIndex({_id:1, date:1}, {unique: true});
var doc1 = {_id: NumberInt(1), date: new ISODate('2015-04-27 00:00:00.000Z')};
var doc2 = {_id: NumberInt(1), date: new ISODate('2015-04-28 00:00:00.000Z')};
collection.insert(doc1);
collection.insert(doc2);
我希望 doc2 可以正常插入,因为即使它的 _id 是 1,它的日期也不同,但是脚本 returns 这个错误:
E11000 duplicate key error index: db.test.$_id_ dup key: { : 1 }
当我对集合执行 find() 时,我实际上只看到:
{ "_id" : 1, "date" : ISODate("2015-04-27T00:00:00.000Z") }
为什么这不起作用?
您不能在唯一复合索引中使用 _id,因为 _id 在 MongoDB 中默认用作唯一键本身。使用 id:
而不是 _idcollection.createIndex({id:1, date:1}, {unique: true});
var doc1 = {id: NumberInt(1), date: new ISODate('2015-04-27 00:00:00.000Z')};
var doc2 = {id: NumberInt(1), date: new ISODate('2015-04-28 00:00:00.000Z')};
它不起作用,因为您对 _id
使用相同的值,它本身具有唯一约束。
为什么不使用这样的东西,它可以为您节省一个索引:
{
_id: {
docid: new ObjectId(),
date: new ISODate()
}
}