Я ищу способ создания представления MongoDB 3.4+, используя pymongo из следующего конвейера:

db.getCollection('parsed_tests').aggregate([{
  $lookup: {
    from: "raw_tests",
    localField: "repository_path",
    foreignField: "repository_path",
    as: "raw_data"
  }
}])

Я хочу сделать это в Python, чтобы скрипт инициализации был одним куском. Кому-нибудь удалось это сделать?

2
niedakh 8 Сен 2017 в 13:26

3 ответа

Лучший ответ

PyMongo не предоставляет метод Database для создания представления. Однако вы можете выполнить команду create создать свой вид с помощью команды метод. Если факт createView является просто оболочкой для create команда

db.command({
    "create": "parsed_tests_view",
    "viewOn": "parsed_tests", 
    "pipeline": pipeline
})
3
styvane 10 Сен 2017 в 18:51

Как говорит sstyvane, вам нужно дать явную команду базы данных. К сожалению, они неправильно поняли синтаксис.

Это сработало для меня:

db.command('create', 'parsed_and_raw_tests', viewOn='parsed_tests', pipeline=my_pipeline)

Кроме того, если у вас есть экземпляр Mongo, обновленный с версии 3.2 или более ранней, вы будете необходимо установить версию совместимости функций на 3.4, прежде чем вы сможете создать представление.

3
Neil Smith 30 Ноя 2017 в 13:51

Как документация MongoDB о представлениях, выделенный метод {{ X0}} - это просто оболочка вокруг метода createCollection(), который присутствует в pymongo.

В MongoDB процесс создания выражается так:

db.createCollection(
  "<viewName>",
  {
    "viewOn" : "<source>",
    "pipeline" : [<pipeline>],
    "collation" : { <collation> }
  }
)

В Python вы можете добиться того же поведения с помощью следующего кода:

# Assuming `db` is your database variable
db.create_collection(
    'parsed_tests_view',
    viewOn='parsed_tests',
    pipeline=[{
        '$lookup': {
            'from': "raw_tests",
            'localField': "repository_path",
            'foreignField': "repository_path",
            'as': "raw_data"
        }
    }]
)

Подробнее о методе create_collection() в документах pymongo.

1
illright 22 Фев 2020 в 13:15