查询嵌入式mongodb->文档(对象)

时间:2013-03-12 20:44:06

标签: php mongodb

我有这个结构:

{
 "_id": NumberInt(101),
"link_id": {
"125": {
"thumb_position": NumberInt(1),
"last_scan": NumberInt(1234563645),
"row_numb": NumberInt(301),
"clicks": NumberInt(120)
},
"126": {
 "thumb_position": NumberInt(2),
 "last_scan": NumberInt(-2147483648),
 "row_numb": NumberInt(1301),
 "clicks": NumberInt(199)
   },
   {
...
   }
}
}   

我希望通过_id和link_id进行查询。我试过用PHP:

 $arr_ = array("_id" => intval(101), "link_id" => "125");
 $res = $collection->findOne($arr_);

和许多其他变体,没有结果。如果我只搜索_id一切正常。有任何想法吗?很多!!

2 个答案:

答案 0 :(得分:1)

由于link_id 125不是值,我看到两个选项:

a)使用$exists运算符:

$arr_ = array(
    "_id" => intval(101),
    "link_id" => array("125" => array('$exists' => true))
);

b)更改您的结构并使用略有不同的查询:

{
    "_id": NumberInt(101),
    "link": [
        {
            "id": "125",
            "thumb_position": NumberInt(1),
            "last_scan": NumberInt(1234563645),
            "row_numb": NumberInt(301),
            "clicks": NumberInt(120)
        },{
            "id": "126",
            …
       }
    ]
}

...

$arr_ = array(
    "_id" => intval(101),
    "link" => array("id" => "125")
);

未经测试但应该以类似的方式工作。

答案 1 :(得分:0)

嗯,这里更好的架构是将它转换为对象数组而不是对象对象,但要回答:

$arr_ = array("_id" => intval(101), "link_id.125" => array('$exists' => true));

这将使用link_id检查该元素作为$exists子文档的键的位置:http://docs.mongodb.org/manual/reference/operator/exists/