我有这个结构:
{
"_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一切正常。有任何想法吗?很多!!
答案 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/