2015-04-29 3 views
0

У меня возникают проблемы с уникальным составным индексом в mongodb. Кодекс говорит лучше так (в Монго оболочки):Mongodb уникальный составной индекс, не соблюдающий Даты

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, дата его отличается, но сценарий возвращает эту ошибку:

E11000 duplicate key error index: db.test.$_id_ dup key: { : 1 } 

Когда я находку() на сбор, я на самом деле вижу только:

{ "_id" : 1, "date" : ISODate("2015-04-27T00:00:00.000Z") } 

Почему это не работает?

ответ

1

Вы не можете использовать _id в уникальном составном индексе, так как _id по умолчанию используется как уникальный ключ в MongoDB. Вместо _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')}; 
0

Это не работает, так как вы используете то же значение для _id, что само по себе имеет единственное ограничение.

Почему бы не использовать что-то вроде этого, что экономит индекс:

{ 
    _id: { 
    docid: new ObjectId(), 
    date: new ISODate() 
    } 
}