我在 MongoDB 中有一个增加的集合,该字段最初定义为整数,但我发现增加后转换为双倍。
但后来我更新了文档,看到了 Long 的变化。
有没有办法阻止 Mongo 中的这些变化?
提前致谢
我在 MongoDB 中有一个增加的集合,该字段最初定义为整数,但我发现增加后转换为双倍。
但后来我更新了文档,看到了 Long 的变化。
有没有办法阻止 Mongo 中的这些变化?
提前致谢
由于 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
让我们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 是无模式的。Schamaless 可以更轻松地更改数据结构,但代价是数据库不强制执行类型约束之类的事情。您需要在应用程序代码中保持纪律,以确保事物以您希望的方式保持不变。
如果您需要确保数据始终是整数类型,那么建议您的应用程序通过应用程序内的数据访问层访问 MongoDB。数据访问层可以强制执行类型约束(以及您想对对象施加的任何其他约束)。
简短的回答:没有办法在 MongoDB 中强制执行此操作。