Совокупный запрос Mongo с функцией forEach в pymongo не работает

У меня есть следующий совокупный запрос монго

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'

Пожалуйста, исправьте, если я сделал какую-либо синтаксическую ошибку. или дайте мне знать, если какой-либо другой формат мне нужно следовать, чтобы заставить его работать


person Rakesh Kotian    schedule 28.10.2020    source источник


Ответы (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.
person wak786    schedule 28.10.2020
comment
Я получаю эту ошибку -> AttributeError: объект «список» не имеет атрибута «forEach» - person Rakesh Kotian; 28.10.2020
comment
Спасибо за голосование. Можете ли вы принять ответ, если он сработал для вас. - person wak786; 28.10.2020