0

我有这个结构:

{
 "_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 一切正常。有任何想法吗?多谢!!

4

2 回答 2

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",
            …
       }
    ]
}

…</p>

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

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

于 2013-03-12T21:29:09.087 回答
0

嗯,这里更好的模式是将其转换为对象数组而不是对象的对象,但是,要回答:

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

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

于 2013-03-12T21:28:56.640 回答