使用 PHP MongoClient find() 查询限制返回的字段

Limit returned fields with PHP MongoClient find() query

我正在编写一个 PHP MongoClient 模型,它访问 mongodb 存储部署日志以及 gitlab 信息、服务器主机和 zend 重启指令。我有一个名为 deployAppConfigs 的 mongo 集合。它的文档结构如下所示:

{
"_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"。我可以使用以下 find() 查询在 Robomongo 的 mongo shell 中执行此命令:

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

这 return 正是我想要的集合中每个文档的内容:

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

}

我在编写等同于 mongo shell 命令的 PHP MongoClient 时遇到问题。我基本上想在 Limit Fields to Return from a Query 上制作此 mongo 文档示例的 PHP MongoClient 版本 我试过像这样使用空数组替换 mongo shell 命令中的“{}”,但没有成功:

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

所有字段共享 vcs.type = "git" 所以我尝试编写一个查询,根据该共享值选择每个文档中的所有字段。它看起来像这样:

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

但这 return 是整个文档,这是我想要避免的。

另一种方法是对集合中的第一个文档执行限制投影 find(),然后使用 MongoCursor 遍历整个集合,但如果可能的话我宁愿不必执行额外的循环.

本质上,我问的是如何将 find() 查询的 return 字段限制为整个集合中每个文档的一个子文档。

看起来我找到了解决方案...我会解决这个问题并保留它,以防它最终对其他人有用。

我最终要做的是改变我的 MongoClient 自定义 class find() 函数,它调用 $collection->find() 查询,以包含一个 $fields 参数。

现在,MongoClient->find() 查询如下所示:

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

在 MongoClient::cursor::find() 上找到答案:here