使用 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
我正在编写一个 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