首页 > 解决方案 > MongoDb 使用 PHP 获取文档子集

问题描述

我有一个这样的 MongoDB 文档结构:

 [
   {
      "locale":"en",
      "translations":[
         {
            "name":"translation1",
            "value":"enValue"
         },
         {
            "name":"translation2",
            "value":"enValue"
         },
         {
            "name":"translation3",
            "value":"enValue"
         }
      ]
   },
   {
      "locale":"ru",
      "translations":[
         {
            "name":"translation1",
            "value":"ruValue"
         },
         {
            "name":"translation2",
            "value":"ruValue"
         },
         {
            "name":"translation3",
            "value":"ruValue"
         }
      ]
   }
]

我需要获取带有translation1locale名称的翻译en。我想要的预期结果是:

{
    "_id" : ObjectId("5e845ba1005e625a6237d2e0"),
    "translations" : [ 
        {
            "name" : "translation1",
            "value" : "enValue"
        }
    ]
}

我知道如何用纯mongo做到这一点,它应该是这样的:

db.translations.find({"locale" : "en"}, 
                     { translations: { $elemMatch: { name: "translation1" } } } )

这是证明https://gyazo.com/fb9b1a505a898c7137ece5304d715171

但我不能让它与 PHP 一起工作。我试过这样的代码:

$collection = $this->database->{$group};
$collection->find(
    [
        'locale' => 'en', 
        'translations' => ['$elemMatch' => ['name' => 'translation1']
    ]
);

我得到了所有的翻译,en而不是仅仅tranlsation1作为结果:

{
    "_id" : ObjectId("5e845ba1005e625a6237d2e0"),
    "locale" : "en",
    "translations" : [ 
        {
            "name" : "translation1",
            "value" : "enValue"
        },
         {
            "name":"translation2",
            "value":"enValue"
         },
         {
            "name":"translation3",
            "value":"enValue"
         }
    ]
}

我试过:

$collection = $this->database->{$group};
$collection->find(
    ['locale' => 'en'],
    [
        'translations' => ['$elemMatch' => ['name' => 'translation1']
    ]
);

结果也和上面一样。

尝试过:

$collection = $this->database->{$group};
$collection->find(
    [
        'locale' => 'en',
        [
            'translations' => ['$elemMatch' => ['name' => 'translation1']
        ]
    ]
);

结果是null

作为一种解决方法,目前,我在 PHP 端过滤结果,但它需要额外的工作

标签: phpmongodb

解决方案


这似乎是驱动程序中的一个错误。

此数据库命令应该等同于find您正在运行的命令,但是该命令按预期工作,而 find 没有。

$this->$database->command([
         'find'=>'CollectionName',
         'filter'=>['locale' => 'en'],
         'projection'=>['translations' => ['$elemMatch' => ['name' => 'translation1']]]
]) 

推荐阅读