pymongo中带有forEach函数的Mongo聚合查询不起作用

Posted

技术标签:

【中文标题】pymongo中带有forEach函数的Mongo聚合查询不起作用【英文标题】:Mongo aggregate query with forEach function in pymongo not working 【发布时间】:2021-02-10 14:26:40 【问题描述】:

我有以下 mongo 聚合查询

db.configurations.aggregate([$group:_id:model:"$model", vendor :"$vendor",access_level : "$access_level",config_data_type :"$config_data_type", dups:$push:"$_id", count: $sum: 1,
$match:count: $gt: 1
]).forEach(function(doc)
  doc.dups.shift();
  db.configurations.remove(_id : $in: doc.dups);
);

对于 pymongo,我写了一个等价的:


pipeline = ["$group":"_id":"model":"$model", "vendor" :"$vendor","access_level" : "$access_level","config_data_type" :"$config_data_type", "dups":"$push":"$_id", "count": "$sum": 1,"$match":"count": "$gt": 1]

dest_col.aggregate(pipeline).forEach(bson.Code( '''
function(doc)
  doc.dups.shift();
  dest_col.remove("_id ": "$in": doc.dups);
'''));

导致以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'CommandCursor' object has no attribute 'forEach'

如果我有任何语法错误,请更正。或者让我知道我是否需要遵循任何其他格式才能使其正常工作

【问题讨论】:

【参考方案1】:

将聚合包裹在 list 中,如下所示 - 因为聚合函数返回 cursor 对象。以前的解决方案也不起作用,因为 pythin 没有像 forEach 这样的东西。您必须执行 for in 才能进行迭代。

result = list(dest_col.aggregate(pipeline))

for doc in result:
  bson.Code( '''
function(doc)
  doc.dups.shift();
  dest_col.remove("_id ": "$in": doc.dups);
''')

I am not python developer. Plz chk the code for syntax errors.

【讨论】:

我得到这个错误 -> AttributeError: 'list' object has no attribute 'forEach' 感谢您的支持。如果对您有用,您能否接受答案。

以上是关于pymongo中带有forEach函数的Mongo聚合查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

是否可以重命名 PyMongo 中 Mongo 查询输出中的字段?

异步瀑布中带有 Mysql 连接池的 ForEach 函数

使用 mongo 查询(pymongo)的内部连接

pymongo的基本操作和使用--练习

pymongo处理ISODate格式日期

MongoDB pymongo模块 更新数据