PyMongo集合名称在cython中表现得很奇怪

时间:2015-11-09 07:28:06

标签: mongodb pymongo cython

所以我在cython中使用pongongo API为mongodb遇到了一些奇怪的行为。

def pull_data(connection, context, data_id):
    collection_name = "%s-%s" % (COLLECTION_MODIFIER, context.sc_id)
    collection = connection[DBNAME][collection_name]
    query = {ID_KEY:data_id}
    json_data = collection.find_one(query)
    return json_data, collection

如果我在命令行中%paste,我就会得到我期望的结果:

In [66]: pull_data(conn, sc, 123)
Out[66]: 
{u'_id': 123,
 u'l': Binary("cnumpy.core.multi [...]

但是如果我在cython扩展中进行完全相同的函数调用,则找不到记录。

我可以在两者之间找到的唯一区别是与集合名称有关:

#collection generated in shell call
Collection(Database(Connection('localhost', 27017), u'db'), u'coll-0') 
#collection generated in cython call
Collection(Database(Connection('localhost', 27017), u'db'), u'db.coll-0') 

如果我尝试在shell中创建具有相同签名的集合,它同样无法找到记录。

有关正在发生的事情或如何在正确的集合中强行搜索的任何线索?

编辑:COLLECTION_MODIFIER = 'coll'在两种情况下均相同。

此外,在删除连字符后以coll = conn.db1.coll0形式进行硬编码会产生同样的问题。

1 个答案:

答案 0 :(得分:0)

我猜那个

collection_name = "%s-%s" % (COLLECTION_MODIFIER, context.sc_id)

在shell中生成'coll-0',在调用中生成'db.coll-0'。在这两种情况下,sc.sc_id似乎都是0。但是COLLECTION_MODIFIER是不同的,coll在一个,db.coll在另一个。

但是你没有向我们展示这些值中的任何一个,或者它们是如何设置的,所以我只能猜测。