【发布时间】:2018-01-13 07:57:55
【问题描述】:
我正在尝试使用 pymongo 更新 mongo 文档中的数组,但它不起作用,但将相同的查询复制到 robomongo 确实有效。
(它返回{'n': 1, 'nModified': 0, 'ok': 1.0, 'updatedExisting': True})
roboMongo:
db.my_collection.updateMany(
{'start_time': 1501700400.0},
{'$pull': {'related': {'$in': [{'KEY': '1', 'TYPE': 'my_type'}]}}},
{upsert:true}
)
pymongo 代码:
query_document = {'start_time': 1501700400.0}
update_command = {'$pull': {'related': {'$in': [{'KEY': '1', 'TYPE': 'my_type'}]}}}
_client[db][collection].update_many(query_document, update_command, True)
文档:
{
"_id" : ObjectId("598570c4ffd387293e368c8d"),
"related" : [
{
"KEY" : "6",
"TYPE" : "my_type"
},
{
"KEY" : "2",
"TYPE" : "my_type"
},
{
"KEY" : "3",
"TYPE" : "my_type"
},
{
"KEY" : "5",
"TYPE" : "my_type"
},
{
"KEY" : "8",
"TYPE" : "my_type"
}
],
"end_time" : 1501621200.0,
"start_time" : 1501700400.0
}
我在想也许它与"和'有关?
有什么建议吗?
谢谢
【问题讨论】:
-
pymongo调用的结果是什么?这是一个错误吗?还是运行正常但什么也没更新?
-
结果是:
{'n': 1, 'nModified': 0, 'ok': 1.0, 'updatedExisting': True} -
那么查询匹配了文档,但是没有改变文档?是因为您正在尝试
$pull和related中不存在的数组元素("KEY": "1", ...)吗?当您在 robomongo 中执行此操作时究竟会发生什么,并且您确定两个查询都在完全相同的文档版本上运行? -
@guessimtoolate 这正是原因。如果没有实际更新的内容,这就是 MongoDB 报告的内容。这是设计使然。问题是“在 shell 中执行”的第一条语句已经从数组中删除了该项目。如果您希望某些内容实际“更新”,则需要指定当前实际“存在”在数组中的内容。更改为
"KEY": "2",该项目将被拉出。 -
各位,我当然是在运行代码之前重新插入了文档
标签: python mongodb pymongo pymongo-2.x