Блокировка поля изменений в 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 нет способа обеспечить это.