MongoDB - $ lookup и $ aggregate в 2 коллекциях

Выражение, которое вы повторяете, вычисляет список объектов модели , а не строк. Итак, правильное их использование:

for u in session.query(User).all():
    print u.id, u.name

Вам действительно нужно преобразовать их в dicts? Конечно, существует много способов, но тогда вам не нужна ORM-часть SQLAlchemy:

result = session.execute(User.__table__.select())
for row in result:
    print dict(row)

Обновление: посмотрите модуль sqlalchemy.orm.attributes. Он имеет набор функций для работы с состоянием объекта, который может быть вам полезен, особенно instance_dict().

1
задан Anthony Winzlet 13 July 2018 в 05:08
поделиться

2 ответа

Вы можете попробовать выполнить агрегацию

db.collection.aggregate([
  { "$unwind": "$aliases" },
  { "$addFields": { "aliasesCode": "$aliases" }},
  { "$lookup": {
    "from": PromotionUsages.collection.name,
    "let": { "aliases": "$aliases" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$code", "$$aliases" ] } } },
      { "$count": "countUsages" }
    ],
    "as": "aliases"
  }},
  { "$unwind": "$aliases" },
  { "$project": { "code": 1, "aliasCode": 1, "countUsages": "$aliases.countUsages" }}
])

Выход

{
    "code": "AAA"
    "aliasCode": "AAA1"
    "countUsages": 2
}
0
ответ дан Anthony Winzlet 17 August 2018 в 13:39
поделиться
Made some changes in solution suggested by Anthony Winzlet

db.promotions.aggregate([
  { "$unwind": "$aliases" },
  { "$addFields": { "aliasesCode": "$aliases" }},
  { "$lookup": {
    "from": "promotionusages",
    "let": { "aliases": "$aliases" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$code", "$$aliases" ] } } },
      { "$count": "countUsages" }
    ],
    "as": "aliases"
  }},
  { "$unwind": "$aliases" },
  { "$project": { "_id" : 0,  "code": 1, "aliasesCode": 1, "countUsages": "$aliases.countUsages" }}
])
0
ответ дан Ashutosh Malik 17 August 2018 в 13:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: