[英]Block a change field in mongoDB
我在MongoDB中有一个集合,它增加了,该字段最初被定义为一个整数,但我发现在增加之后转换为double。
但后来我对文档进行了更新,看到对Long的更改。
有没有办法阻止Mongo中的这些变化?
提前致谢
MongoDB是无架构的。 Schamalessness可以更轻松地更改数据结构,但代价是数据库不强制执行类型约束等操作。 您需要在应用程序代码中遵守规则,以确保按照您希望的方式保留事物。
如果您需要确保数据始终是Integer类型,那么建议您的应用程序通过应用程序中的数据访问层访问MongoDB。 数据访问层可以强制执行类型约束(以及您希望放在对象上的任何其他约束)。
简短回答:没有办法在MongoDB中强制执行此操作。
由于MongoDB每个集合没有固定的模式,因此无法在数据库端阻止此类更改。 确保您在任何地方使用相同的数据类型,包括其更新操作。 C#驱动程序非常聪明。
使用外壳时要小心,它可能会有刺激性。 默认情况下,mongo shell会将每个数字视为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
让我们在$inc
使用NumberLong
:
> 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.