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

0

Я пишу 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() только одним поддокументом каждого документа во всей коллекции.

  • 0
    Может быть, это поможет вам: docs.mongodb.org/manual/reference/method/cursor.limit/… Вот как это использовать: docs.mongodb.org/manual/reference/method/db.collection.find/…
  • 0
    попробуйте что-то вроде этого: db.deployAppConfigs.find({}, {"vcs": 1, "app_name": 1}).limit(5)
Показать ещё 2 комментария
Теги:
mongodb-query
mongodb-php

1 ответ

0

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

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

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

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

Найден ответ на MongoClient :: cursor :: find(): здесь

  • 0
    Хм, отправка в aray не работает? Я часто использую этот метод. Какая ошибка была возвращена?
  • 0
    Ну, я попытался сделать это по существу, но с пустым array () для части запроса функции find (). Это не сработало из-за того, как работала моя функция класса ... Так что на самом деле я правильно использовал запрос find () mongoclient, но неправильно использовал свой собственный код. DOH!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню