【问题标题】:MongoDB Number Field will not insert or update with the number that I inputMongoDB Number Field 不会插入或更新我输入的数字
【发布时间】:2013-12-15 02:39:40
【问题描述】:

这是我的问题:

db.Group6391102Bounds.insert({ bound:"latest",id:138548488276343678,complete:false}) db.Group6391102Bounds.find()

   { "_id" : ObjectId("5297d9e5ef9f659b82271617"), "bound" : "earliest", "id" : 138548488276343680, "complete" : false }
   { "_id" : ObjectId("5297dc28b2d702ea878b540d"), "bound" : "latest", "id" : 138548488276343680, "complete" : false }

db.Group6391102Bounds.insert({ bound:"middle",id:138548488276343678,complete:false}) db.Group6391102Bounds.find()

   { "_id" : ObjectId("5297d9e5ef9f659b82271617"), "bound" : "earliest", "id" : 138548488276343680, "complete" : false }
   { "_id" : ObjectId("5297dc28b2d702ea878b540d"), "bound" : "latest", "id" : 138548488276343680, "complete" : false }
   { "_id" : ObjectId("5297dc3cb2d702ea878b540e"), "bound" : "middle", "id" : 138548488276343680, "complete" : false }

db.Group6391102Bounds.insert({ bound:"middle",name:138548488276343678,complete:false}) db.Group6391102Bounds.find()

   { "_id" : ObjectId("5297d9e5ef9f659b82271617"), "bound" : "earliest", "id" : 138548488276343680, "complete" : false }
   { "_id" : ObjectId("5297dc28b2d702ea878b540d"), "bound" : "latest", "id" : 138548488276343680, "complete" : false }
   { "_id" : ObjectId("5297dc3cb2d702ea878b540e"), "bound" : "middle", "id" : 138548488276343680, "complete" : false }
   { "_id" : ObjectId("5297dc91b2d702ea878b540f"), "bound" : "middle", "name" : 138548488276343680, "complete" : false }

如您所见,即使我插入了一个特定的 ID,mongoDB 也会添加一个不同的 ID。 我不知道为什么会这样。任何帮助将不胜感激。感恩节快乐!

【问题讨论】:

    标签: mongodb insert insert-update mongodb-query


    【解决方案1】:

    抱歉,我一开始没有理解您的问题,因此提供了错误的答案(感谢 cababunga 指出这一点)。所以这里是正确的。

    Mongoshell 支持不同的data types。当你输入它时,它会尝试猜测你的数据类型。所以你输入你的大号码:138548488276343678。请注意,它大于 2^31-1,这是 32 位整数的最大值。所以它把它当作一个浮点数,因为浮点数没有精确地存储,它会稍微修改它。这就是为什么您存储的数字几乎相同,但略有不同(此差异将小于 8)。但是你想精确地存储这个数字并且 mongo 支持 64 位整数(适合你的整数)。

    因此您需要指定要将其存储为64bit integer。您可以通过以下方式执行此操作:

    db.a.insert({
      bound:"latest",
      id: NumberLong("138548488276343678"),  // Note these "". I was not using them and the number was not stored correctly
      complete:false
    })
    

    在此之后,您可以检索您的文档db.a.find(),它将是正确的。请注意,很多驱动程序都有类似的问题,因此您必须明确告诉您要将它们保存为 64 位整数。

    这是我的错误尝试。如果你认为它不应该在这里, 请修改我的问题:

    如果你没有为你正在创建的文档指定_id,mongodb 会自己创建_id 字段。您可以阅读更多关于 _id hereofficial documentation 的信息。

    如果您有自己的字段,您希望将其用作_id,而不是写id:138548488276343678,您应该写_id : 138548488276343678

    附:还因为我看到您使用的数字很大,请记住 mongodb 中的整数存储为 64-bit integers (这意味着它在 -2^63 到 2^63 - 1 之间)

    【讨论】:

    • _id 必须是唯一的。正如您在示例中看到的,id 在每个插入中都是相同的。
    • @cababunga 感谢您指出这一点。我更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    相关资源
    最近更新 更多