Блокировка поля изменений в mongoDB

У меня есть коллекция в MongoDB, которая делает увеличение, поле изначально было определено как Integer, но я обнаружил, что после увеличения было преобразовано в удвоение.

Но затем я делаю обновление документа и вижу, что меняется на Long.

Есть ли способ заблокировать эти изменения в Монго?

заранее спасибо

2 ответа

Решение

Поскольку MongoDB не имеет фиксированной схемы для каждой коллекции, нет способа предотвратить такие изменения на стороне базы данных. Убедитесь, что вы используете один и тот же тип данных для поля везде, включая его операции обновления. Драйвер C# довольно умен в этом.

Будьте осторожны при работе с оболочкой, это может вызвать раздражение. По умолчанию оболочка Монго будет обрабатывать каждое число как doubleНапример:

> db.Inc.find().pretty();
{ "_id" : 1, "Number" : 1000023272226647000 }
// this number is waaayyy larger than the largest 32 bit int, but there's no
// NumberLong here. So it must be double.
> db.Inc.update({}, {$inc: {"Number" : 1 }});
> db.Inc.find().pretty();
{ "_id" : 1, "Number" : 1000023272226647000 }
// Yikes, the $inc doesn't work anymore because of precision loss

Давайте использовать NumberLong:

> db.Inc.insert({"Number" : NumberLong("1000023272226647000")});
> db.Inc.update({}, {$inc: {"Number" : 1}});
> db.Inc.find();
{ "Number" : 1000023272226647000, "_id" : 1 }
// Yikes! type conversion changed to double again! Also note 
// that the _id field moved to the end

Давайте использовать NumberLong Также в $inc:

> db.Inc.insert({"Number" : NumberLong("1000023272226647000")});
> db.Inc.update({}, {$inc: {"Number" : NumberLong("1")}});
> db.Inc.find();
{ "_id" : 1, "Number" : NumberLong("1000023272226647001") }
// This actually worked

В C# работают оба следующих обновления: Number остается долго

class Counter { public long Number {get;set;} public ObjectId Id {get;set;} }
var collection = db.GetCollection("Counter");
collection.Insert(new Counter { Number = 1234 }); 
collection.Update(Query.Null, Update<Counter>.Inc(p => p.Number, 1)); // works
collection.Update(Query.Null, Update.Inc("Number", 1)); // works too

MongoDB без схемы. Schamalessness обеспечивает более легкие изменения в вашей структуре данных, но за счет базы данных, не применяя такие вещи, как ограничения типа. Вы должны быть дисциплинированными в коде своего приложения, чтобы гарантировать, что все будет сохраняться так, как вы этого хотите.

Если вам необходимо убедиться, что данные всегда имеют тип Integer, рекомендуется, чтобы ваше приложение обращалось к MongoDB через уровень доступа к данным в приложении. Уровень доступа к данным может обеспечивать ограничения типа (а также любые другие ограничения, которые вы хотите наложить на ваши объекты).

Краткий ответ: в MongoDB нет способа обеспечить это.

Другие вопросы по тегам