[MongoDb使用PHP提取文档子集

问题描述 投票:0回答:1

我有一个像这样的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"
         }
      ]
   }
]

并且我需要获得名称为translation1的语言环境en的翻译。我想要的预期结果是:

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

我知道如何用纯蒙哥做到这一点,应该像这样:

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端过滤结果,但这是额外的工作

php mongodb
1个回答
0
投票

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

此数据库命令应等效于您正在运行的find,但该命令可以正常工作,而查找却不能。

$this->$database->command([
         'find'=>'CollectionName',
         'filter'=>['locale' => 'en'],
         'projection'=>['translations' => ['$elemMatch' => ['name' => 'translation1']]]
]) 
© www.soinside.com 2019 - 2024. All rights reserved.