我正在编写一个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“子文档和"app_name"。我能够使用以下find()查询在Robomongo的mongo中执行此命令:
db.deployAppConfigs.find({}, {"vcs": 1, "app_name": 1})这将准确地返回集合中每个文档所需的内容:
{
"_id" : ObjectId("54de193790ded22d1cd24c36"),
"app_name" : "ai2_api",
"vcs" : {
"type" : "git",
"name" : "input/ai2-api"
}}
我在编写相当于mongo命令的PHP命令时遇到了问题。基本上,我想在这个mongo文档示例中创建一个PHP MongoClient版本,在限制从查询返回的字段上我尝试使用一个空数组来替换MongoClient命令中的"{}“,但是它没有工作:
$query = array (
array(),
array("vcs"=> 1, "app_name"=> 1)
);所有字段都共享vcs.type = "git",因此我尝试编写一个查询,根据该共享值选择每个文档中的所有字段。看起来是这样的:
$query = array (
"vcs.type" => "git"
);但是这会返回整个文档,这正是我想要避免的。
另一种方法可以是对集合中的第一个文档执行极限投影find(),然后使用MongoCursor迭代整个集合,但如果可能的话,我不希望执行额外的循环。
本质上,我是问如何将find()查询的返回字段限制为整个集合中每个文档的一个子文档。
发布于 2015-02-16 16:17:16
看来我找到了解决办法..。我会解决这个问题,如果它最终对其他人有用的话,我就不提了。
最后我要做的是修改我的MongoClient自定义类find()函数,它调用$collection->find()查询,以包含一个$fields参数。
现在,MongoClient->find()查询如下所示:
$collection->find(
array("vcs.type" => "git"),
array("vcs" => 1, "app_name" = 1)
)在MongoClient::cursor::find():这里上找到答案
https://stackoverflow.com/questions/28545485
复制相似问题