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 は値ではないため、次の 2 つのオプションがあります。

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これは、次を使用して、その要素がサブドキュメントのキーとして存在する場所をチェックします$exists: http://docs.mongodb.org/manual/reference/operator/exists/

于 2013-03-12T21:28:56.640 に答える