mongodb — ограничение возвращаемых полей с помощью PHP MongoClient запрос find ()

Я пишу модель PHP MongoClient, которая обращается к mongodb, где хранятся журналы развертывания с информацией о gitlab, хостами сервера и инструкциями по перезапуску Zend. У меня есть коллекция монго, которая называется deployAppConfigs. Его структура документа выглядит так:

{
"_id" : ObjectId("54de193790ded22d1cd24c36"),
"app_name" : "ai2_api",
"name" : "AI2 Admin API",
"app_directory" : "path_to_app",
"app_owner" : "www-data:deployers",
"directories" : [],
"vcs" : {
"type" : "git",
"name" : "input/ai2-api"},
"environments" : {
"development" : {
...
},
"qa" : {
...
},
"staging" : {
...
},
"production" : {
...
},
"actions" : {
"post_checkout" : [
"composer_install"]
}

}

Поскольку в этой коллекции много документов, я хотел бы запросить всю коллекцию только для под-документ «vcs» и «Имя приложения». Я могу выполнить эту команду в оболочке Монго Робомонго с помощью следующего запроса find ():

db.deployAppConfigs.find({}, {"vcs": 1, "app_name": 1})

Это возвращает именно то, что я хочу для каждого документа в коллекции:

{
"_id" : ObjectId("54de193790ded22d1cd24c36"),
"app_name" : "ai2_api",
"vcs" : {
"type" : "git",
"name" : "input/ai2-api"}

}

У меня проблема с написанием PHP MongoClient, эквивалентного этой команде оболочки mongo. Я в основном хочу сделать PHP MongoClient версию этого примера документации на Ограничить поля для возврата из запроса
Я попытался использовать пустой массив для замены «{}» в команде оболочки mongo следующим образом, но это не сработало:

$query = array (
array(),
array("vcs"=> 1, "app_name"=> 1)
);

Все поля разделяют vcs.type = «git» поэтому я попытался написать запрос, который выбирает все поля в каждом документе на основе этого общего значения. Это выглядит так:

$query = array (
"vcs.type" => "git");

Но это возвращает весь документ, чего я хочу избежать.

Альтернативой может быть выполнение функции limit () для первого документа в коллекции, а затем использование MongoCursor для перебора всей коллекции, но я бы не стал делать дополнительный цикл, если это возможно.

По сути, я спрашиваю, как ограничить возвращаемые поля запроса find () только одним вложенным документом каждого документа во всей коллекции.

0

Решение

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

В конечном итоге мне пришлось изменить мою функцию find () пользовательского класса MongoClient, которая вызывает запрос $ collection-> find (), на включение параметра $ fields.

Теперь запрос MongoClient-> find () выглядит так:

$collection->find(
array("vcs.type" => "git"),
array("vcs" => 1, "app_name" = 1)
)

Нашел ответ по MongoClient :: cursor :: find (): Вот

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]