elemMatch查询在php中不工作



这个mongodb查询可以正确返回具有匹配子文档条件的文档

db.user.find(
    {Type: {"$in": ["local","google"]}, 
     Alerts:{$elemMatch:{"Frequency.Type":"daily","IsActive":true}}
})

当我把它转换成php数组时它什么也没有返回

$qry = array("Type"=>array('$in'=>array("local","google")),
       array('Alerts'=>array('$elemMatch'=>array('Frequency.Type'=>'daily','IsActive'=>true))));

这是文档的结构

{
    "Email" : "someemail@domain.com",
    "Type" : "confirmed",
    "FName" : "Sung",
    "Alerts" : [ 
        {
            "Keyword" : "administrative",
            "Frequency" : {
                "Type" : "weekly"
            }
            "IsActive" : true
        },
        {
            "Keyword" : "marketing",
            "Frequency" : {
                "Type" : "daily"
            }
            "IsActive" : true
        }
    ]
}

当我从php数组中取出elemMatch部分时,它返回行。所以我在连接,那里有数据。不确定是否我编码的数组正确,但我认为$elemMatch不支持正确的php mongodb库。聚合不是一个选项。我需要一个游标,因为这将返回大数据集,不想崩溃的服务器。搜索了web,无法找到$elemMatch mongodb查询在php中完成的工作示例。

您的数组多了一个。

$qry = array(
    "Type"=>array('$in'=>array("local","google")),
    "Alerts"=>array('$elemMatch'=>array(
        "Frequency.Type"=> "daily",'IsActive'=>true
    ))
);

以后,试着像我这样缩进你的代码,这样你就能清楚地看到结构。此外,由于您正在比较已知的JSON结构,因此请执行以下操作:

echo json_encode( $qry, JSON_PRETTY_PRINT ) ."n";

然后您可以清楚地看到您所做的与预期输出不匹配的内容。

BTW -如果你有一个JSON格式的查询,你知道工作,你只是想把它进入PHP,你可以使用PHP的json_decodevar_export转换你的(有效的)JSON查询到PHP查询。

例如,上面的查询(在jsonify一个位之后)可以使用以下代码进行转换:
var_export(json_decode(
    '{
       "Type": {"$in": ["local","google"]}, 
       "Alerts":{ "$elemMatch": {"Frequency.Type":"daily","IsActive":true}}
     }',true));

和输出(删除一些空白后,因为var_export的输出是糟糕的空白)看起来像这样:

array (
  'Type' => array ( '$in' => array ( 0 => 'local', 1 => 'google', ), ),
  'Alerts' => array ( '$elemMatch' => array (
    'Frequency.Type' => 'daily',
    'IsActive' => true,
  ), ),
)

(您可能还希望删除编号索引)。

我有非常类似的问题。文档结构:

[
   {
      "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"
         }
      ]
   }
]
代码:

/** @var BSONDocument|null $result  */
$result = $collection->findOne(
    [
        'locale' => ['$eq' => $locale],
         'translations' => ['$elemMatch' => ['name' => 'translation1']]
    ]
);
dd(json_encode($result->getArrayCopy()));

json编码的结果是:

{
    "_id": {
        "$oid": "5e988dda2566154a5a442a53"
    },
    "locale": "en",
    "translations": [
        {
            "name": "translation1",
            "value": "translation222 value for en"
        },
        {
            "name": "translation2",
            "value": "translation222 value for en"
        },
        {
            "name": "translation3",
            "value": "translation 333 value for en"
        }
    ]
}

最新更新