Я пишу PHP MongoClient Model, который обращается к mongodb, который хранит журналы развертывания с информацией gitlab, серверами и инструкциями по перезагрузке zend. У меня есть коллекция mongo под названием 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" и "app_name". Я могу выполнить эту команду в оболочке Robomongo mongo со следующим запросом 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 docs в Limit Fields для возврата из запроса. Я попытался использовать пустой массив для замены "{}" в команде оболочки mongo, как это, но это не сработало:
$query = array (
array(),
array("vcs"=> 1, "app_name"=> 1)
);
Все поля разделяют vcs.type = "git", поэтому я попытался написать запрос, который выбирает все поля в каждом документе на основе этого общего значения. Это выглядит так:
$query = array (
"vcs.type" => "git"
);
Но это возвращает весь документ, чего я хочу избежать.
Альтернативой может быть создание лимита проекции find() для первого документа в коллекции, а затем использование MongoCursor для итерации по всей коллекции, но я бы предпочел не использовать дополнительный цикл, если это возможно.
По сути, я спрашиваю, как ограничить возвращаемые поля запроса find() только одним поддокументом каждого документа во всей коллекции.
похоже, что я смог найти решение... Я решу вопрос и оставлю его на случай, если он окажется полезным для кого-либо еще.
То, что мне пришлось сделать, это изменить функцию MongoClient custom class find(), которая вызывает запрос $collection-> find(), чтобы включить параметр $ fields.
Теперь запрос MongoClient-> find() выглядит так:
$collection->find(
array("vcs.type" => "git"),
array("vcs" => 1, "app_name" = 1)
)
Найден ответ на MongoClient :: cursor :: find(): здесь
db.deployAppConfigs.find({}, {"vcs": 1, "app_name": 1}).limit(5)