【问题标题】:pymongo returning different data than MongoDB Shellpymongo 返回与 MongoDB Shell 不同的数据
【发布时间】:2014-10-25 00:11:58
【问题描述】:

我正在使用 monogdb 进行分配,我遇到了以下问题:pymongo 返回的文档与mongoc 返回的文档不匹配。一个简单的test.py

from pymongo import MongoClient
from bson.objectid import ObjectId

client = MongoClient()
db = client['dev_database']
print db.trials.find_one(ObjectId('522f975dc91e273451569942'))
print list(db.trials.find({'_id':ObjectId('522f975dc91e273451569942')}))

以防万一。这返回:

{u'nurse_id': u'522f975dc91e273451569941', u'question_ids': [], u'name': u'Test Trial', u'clinician_id': u'522f975dc91e273451569940', u'arms': {u'Med1': u'', u'Placebo': u''}, u'participant_ids': [], u'keywords': [u'abc', u'123'], u'_id': ObjectId('522f975dc91e273451569942')}
[{u'nurse_id': u'522f975dc91e273451569941', u'question_ids': [], u'name': u'Test Trial', u'clinician_id': u'522f975dc91e273451569940', u'arms': {u'Med1': u'', u'Placebo': u''}, u'participant_ids': [], u'keywords': [u'abc', u'123'], u'_id': ObjectId('522f975dc91e273451569942')}]

如果我在 MongoDB Shell 中做同样的事情:

> use dev_database
switched to db dev_database
> db.trials.find('522f975dc91e273451569942')
{ "_id" : "522f975dc91e273451569942", "nurse_id" : "522f975dc91e273451569941", "question_ids" : [ ], "name" : "Test Trial", "clinician_id" : "522f975dc91e273451569940", "arms" : { "Med1" : "", "Placebo" : "" }, "participant_ids" : [
        "52325b93c91e274e81f4bdda",
        "52325b93c91e274e81f4bddb",
        "52325b93c91e274e81f4bddc",
        "52325b93c91e274e81f4bddd",
        "52325b93c91e274e81f4bdde"
], "keywords" : [ "abc", "123" ] }
>

如您所见,test.py 返回一个文档,其中participant_ids 是一个空列表,但 MongoDB Shell 另有说明。

我不知道为什么会这样,看来我一定是在某个地方犯了一个简单但根本性的错误。

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    问题原来是我的代码保存了此文档的副本,其中_id 的类型为str。例如

    > db.trials.find()
    { "_id" : ObjectId("522f975dc91e273451569942"), "nurse_id" : "522f975dc91e273451569941", "question_ids" : [ ], "name" : "Test Trial", "clinician_id" : "522f975dc91e273451569940", "arms" : { "Med1" : "", "Placebo" : "" }, "participant_ids" : [ ], "keywords" : [ "abc", "123" ] }
    { "_id" : "522f975dc91e273451569942", "nurse_id" : "522f975dc91e273451569941", "question_ids" : [ ], "name" : "Test Trial", "clinician_id" : "522f975dc91e273451569940", "arms" : { "Med1" : "", "Placebo" : "" }, "participant_ids" : [
            "52325b93c91e274e81f4bdda",
            "52325b93c91e274e81f4bddb",
            "52325b93c91e274e81f4bddc",
            "52325b93c91e274e81f4bddd",
            "52325b93c91e274e81f4bdde"
    ], "keywords" : [ "abc", "123" ] }
    

    MongoDB Shell 总是返回第二个结果,而测试代码返回第一个。不同之处在于我的代码显式转换为 ObjectId,而 MongoDB Shell 似乎很乐意先尝试使用 str 找到匹配项。

    MongoDB Shell 的结果在 _id 字段中缺少 ObjectId(...) 的事实应该警告我有些不对劲。

    【讨论】:

      【解决方案2】:

      下一个代码的输出是什么?

      from pymongo import MongoClient
      from bson.objectid import ObjectId
      
      client = MongoClient()
      db = client['dev_database']
      print json.dumps(db.trials.find_one(ObjectId('522f975dc91e273451569942')))
      

      【讨论】:

      • 毫不奇怪:TypeError: ObjectId('522f975dc91e273451569942') is not JSON serializable
      • 对不起,这是我的错误。似乎 .find() 返回正确的数据,但“打印列表()”不会递归打印数组。尝试读取participant_ids 数组中的对象数。奇迹不会发生。
      • 只需从 mongodb 中读取一个对象,并确保他的“participant_ids”字段为空。我相信不是。
      • 奇迹不会发生,但列表会递归打印。无论如何,len(doc['participant_ids']) 返回 0。空列表为空。
      猜你喜欢
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 2016-11-18
      • 2013-03-03
      • 2013-11-04
      • 2015-05-07
      • 1970-01-01
      • 2013-09-08
      相关资源
      最近更新 更多