Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pymongo:findandmodify-”文件;“没有这样的命令”;归还_Python_Mongodb_Pymongo - Fatal编程技术网

Python pymongo:findandmodify-”文件;“没有这样的命令”;归还

Python pymongo:findandmodify-”文件;“没有这样的命令”;归还,python,mongodb,pymongo,Python,Mongodb,Pymongo,我相信pymongo(或者,至少是文档)中有一个bug,它使得运行findandupdate查询变得不可能 下面是发生的情况。当我跑步时: result = db.command({ 'findandmodify': 'my_collection', 'query': {'foo': 'bar'}, 'update': {'$set': {'status': 'queued'}}, }) 实际发送到服务器的查询是: { 'quer

我相信pymongo(或者,至少是文档)中有一个bug,它使得运行
findandupdate
查询变得不可能

下面是发生的情况。当我跑步时:

    result = db.command({
        'findandmodify': 'my_collection',
        'query': {'foo': 'bar'},
        'update': {'$set': {'status': 'queued'}},
    })
实际发送到服务器的查询是:

{ 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … }
请注意,
query
参数是第一个,而
findandmodify
是第二个

但这会导致服务器抛出:

OperationFailure: command { 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … } failed: no such cmd 操作失败:命令{'query':{'foo':'bar'},'findandmodify':'my_collection',…}失败:没有这样的命令 因为服务器希望
find和modify
是第一位的(显然,BSON指令是有序的)


有什么解决方法吗?

一种解决方法可能是构造命令的JavaScript版本并将其传递给db.eval()


问题是,正如Alex提到的,Python dict没有顺序,因此您或多或少需要手动构建字符串。

对于没有内置排序dict类型的语言,mongo驱动程序包括一个。在python中,这是子类型:。对于所有命令,您都需要使用它


如果仍然失败,请确保您使用的是最新版本的数据库,因为find和modify是一项新功能。

当前的pymongo api内置了find和modify
更多信息,请参见PyMongo文档:

注意,命令文档中键的顺序很重要( “动词”必须放在第一位),因此需要多个键的命令(例如。 findandmodify)应使用SON实例或字符串和kwargs 而不是Python dict


您正在运行哪个版本的Mongo?Python
dict
s没有内在的顺序,因此您关于“第一”和“第二”的评论在Python语言的上下文中完全是胡说八道。请澄清@Alex是的,这就是问题所在:Python的dict是无序的,但是(显然)BSON dict(它们被称为dict吗?)是无序的。我不知道BSON。在与Javascript规范相匹配的JSON中,对象(相当于字典,除了键必须是特定的字符串)没有排序。好的,所以MongoDB文档()对此并不完全清楚……但是Wikipedia()建议BSON对象是排序的,Mongo实现似乎也提出了同样的建议。Javascript对象也没有内在的顺序(根据语言标准,尽管特定的JS实现当然可以自由添加任意顺序——重点是,没有保证!)。JS标准说顺序是未定义的,但大多数实现保留了向对象中添加元素的顺序。在这两种情况下,本例都能正确地与Mongo的解释器配合使用
db.eval('db.runCommand({"findandmodify": "my_collection", "query": {"foo": "bar"}, "update": {"$set": {"status": "queued"}},})')