elemMatch查询在php中不起作用

时间:2014-03-18 21:27:11

标签: php mongodb mongodb-query nosql

此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部分时,它返回行。所以我在连接,那里有数据。不确定我是否正确编码阵列,但我认为在php mongodb库中没有正确支持$ elemMatch。聚合不是一种选择。我需要一个游标,因为这将返回大型数据集,并且不想让服务器崩溃。搜索网络,找不到在php中完成$ elemMatch mongodb查询的工作示例。

3 个答案:

答案 0 :(得分:4)

你有一个太多的阵列。

$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";

然后你可以清楚地看到你所做的与预期输出不匹配的事情。

答案 1 :(得分:0)

顺便说一句 - 如果你有一个JSON格式的查询,你知道它可以工作而你只想把它变成PHP,你可以使用PHP的json_decodevar_export来转换你的(有效的)JSON查询到PHP查询。

例如,您可以使用以下代码转换上面的查询(在JSONifying之后):

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,
  ), ),
)

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

答案 2 :(得分:0)

我有非常相似的问题。 文件结构:

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