【问题标题】:Pymongo find if value has a datatype of NumberLongPymongo 查找 value 的数据类型是否为 NumberLong
【发布时间】:2014-06-22 20:04:38
【问题描述】:

我正在使用 Pymongo 驱动程序,我的文档如下所示:

{
"_id" : ObjectId("5368a4d583bcaff3629bf412"),
"book_id" : NumberLong(23302213),
"serial_number" : '1122',
}

这是有效的,因为序列号是一个字符串:

find_one({"serial_number": "1122"})

但是,这不是:

find_one({"book_id": "23302213"})

显然是因为 book_id 的数据类型为 NumberLong。如何根据这个数据类型执行 find 方法?

================================================ ===

更新:

仍然无法让它工作,我只能找到字符串值。任何建议将不胜感激。

【问题讨论】:

  • 您是否尝试过将数字而不是字符串传递给它? find_one({"book_id": 23302213})?
  • 是的,我确实试过了,但没有找到任何东西!
  • 当您在解释器中检查该字典时,book_id 的类型是什么?
  • 试试find_one({"book_id": long(23302213)})
  • 进入shell并执行db.coll.find( {"book_id": NumberLong(23302213) }

标签: python mongodb pymongo


【解决方案1】:

您需要确保您的数据类型匹配。 MongoDB 对类型很严格。当您执行此操作时:

find_one({"book_id": "23302213"})

您正在向 MongoDB 请求 book_id 等于 "23302213" 的文档。由于您没有将book_id 存储为string 类型,而是作为long 类型存储,因此查询需要尊重:

find_one({"book_id": long(23302213)})

如果由于某种原因,您的应用程序中将 ID 作为字符串,这也可以:

find_one({"book_id": long("23302213")})

更新

刚刚检查过(MacOS 64bit、MongoDB 2.6、Python 2.7.5、pymongo 2.7),即使提供整数也能正常工作。

集合中的文档(由 Mongo shell 显示):

{ "_id" : ObjectId("536960b9f7e8090e3da4e594"), "n" : NumberLong(222333444) }

python shell 的输出:

>>> collection.find_one({"n": 222333444})
{u'_id': ObjectId('536960b9f7e8090e3da4e594'), u'n': 222333444L}
>>> collection.find_one({"n": long(222333444)})
{u'_id': ObjectId('536960b9f7e8090e3da4e594'), u'n': 222333444L}

【讨论】:

  • 嗯..这就是我的想法。但它仍然找不到任何东西!
  • 我不认为NumberLong 类型对应于long。至少如果我用long() 在 mongodb 中存储一个数字,我可以通过给出一个整数来查询它。如有必要,也许pymongo 会在内部进行转换。
【解决方案2】:

您可以使用 $type: http://docs.mongodb.org/manual/reference/operator/query/type/

INT 是 16,BIGINT 是 18

【讨论】:

  • 我似乎看不到如何将这个 find_one({"book_id":{ "$type": 18 } }) 与 Pymongo 驱动程序一起使用。支持吗?
猜你喜欢
  • 2021-12-16
  • 2017-08-19
  • 1970-01-01
  • 2022-12-15
  • 2017-07-22
  • 1970-01-01
  • 2013-03-02
  • 2013-07-18
  • 2014-03-25
相关资源
最近更新 更多