0

我在 MongoDB 中有一个增加的集合,该字段最初定义为整数,但我发现增加后转换为双倍。

但后来我更新了文档,看到了 Long 的变化。

有没有办法阻止 Mongo 中的这些变化?

提前致谢

4

2 回答 2

1

由于 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
于 2013-08-22T21:11:28.847 回答
1

MongoDB 是无模式的。Schamaless 可以更轻松地更改数据结构,但代价是数据库不强制执行类型约束之类的事情。您需要在应用程序代码中保持纪律,以确保事物以您希望的方式保持不变。

如果您需要确保数据始终是整数类型,那么建议您的应用程序通过应用程序内的数据访问层访问 MongoDB。数据访问层可以强制执行类型约束(以及您想对对象施加的任何其他约束)。

简短的回答:没有办法在 MongoDB 中强制执行此操作。

于 2013-08-22T21:03:14.390 回答