3

ドキュメント構造の例は次のとおりです。

{
   "dob": "12-13-2001",
   "name": "Kam",

   "visits": {
     "0": {
       "service_date": "12-5-2011",
       "payment": "40",
       "chk_number": "1234455",  
    },
     "1": {
       "service_date": "12-15-2011",
       "payment": "45",
       "chk_number": "3461234",  
    },
     "2": {
       "service_date": "12-25-2011",
       "payment": "25",
       "chk_number": "9821234",  
    } 
  } 
}


{
   "dob": "10-01-1998",
   "name": "Sam",

   "visits": {
     "0": {
       "service_date": "12-5-2011",
       "payment": "30",
       "chk_number": "86786464",  
    },
     "1": {
       "service_date": "12-15-2011",
       "payment": "35",
       "chk_number": "45643461234",  
    },
     "2": {
       "service_date": "12-25-2011",
       "payment": "20",
       "chk_number": "4569821234",  
    } 
  } 
}

PHP では、支払いが「30」未満のすべての「訪問」情報 (および対応する「名前」) をリストしたいと考えています。

他ではなく、「支払い」<「30」の訪問のみを印刷したい。そのようなクエリは可能ですか、または最初に検索を使用してドキュメント全体を取得し、次に PHP を使用してそのような訪問を選択する必要がありますか??

4

3 に答える 3

18

サンプル ドキュメントでは、「支払い」の値が文字列として指定されていますが、これは $lt コマンドでは意図したとおりに機能しない可能性があります。この応答では、整数に変換しました。

MongoDB ではワイルドカード クエリを使用できないため、指定されたドキュメント構造では、サブドキュメントのキー (0、1、2 など) を知る必要があります。たとえば、次のクエリは機能します。

> db.test.find({"visits.2.payment":{$lt:35}})

でも、

> db.test.find({"visits.payment":{$lt:35}})

この場合は機能しません。

> db.test.find({"visits.*.payment":{$lt:35}})

また、結果は返されません。

埋め込まれた「visits」ドキュメントをクエリできるようにするには、ドキュメント構造を変更し、「visits」を配列または埋め込みドキュメントにする必要があります。次のようにします。

> db.test2.find().pretty()
{
    "_id" : ObjectId("4f16199d3563af4cb141c547"),
    "dob" : "10-01-1998",
    "name" : "Sam",
    "visits" : [
        {
            "service_date" : "12-5-2011",
            "payment" : 30,
            "chk_number" : "86786464"
        },
        {
            "service_date" : "12-15-2011",
            "payment" : 35,
            "chk_number" : "45643461234"
        },
        {
            "service_date" : "12-25-2011",
            "payment" : 20,
            "chk_number" : "4569821234"
        }
    ]
}

これで、「訪問」ですべての埋め込みドキュメントをクエリできます。

> db.test2.find({"visits.payment":{$lt:35}})

詳細については、ドット表記に関する Mongo ドキュメントを参照してください。

http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

質問の 2 番目の部分に進みます。埋め込みドキュメントの条件付きサブセットのみを返すことはできません。

どちらのドキュメント形式でも、クエリに一致するサブドキュメントのみを含むドキュメントを返すことはできません。サブドキュメントの 1 つがクエリに一致する場合、ドキュメント全体がクエリに一致し、それが返されます。

Mongo Document「フィールドのサブセットの取得」に従って

http://www.mongodb.org/display/DOCS/Retrifying+a+Subset+of+Fields

次のように、埋め込まれたドキュメントの一部を返すことができます。

> db.test2.find({"visits.payment":{$lt:35}},{"visits.service_date":1}).pretty()
{
    "_id" : ObjectId("4f16199d3563af4cb141c547"),
    "visits" : [
        {
            "service_date" : "12-5-2011"
        },
        {
            "service_date" : "12-15-2011"
        },
        {
            "service_date" : "12-25-2011"
        }
    ]
}

ただし、一部のサブドキュメントを条件付きで取得することはできません。取得できる最も近いのは $slice 演算子ですが、これは条件付きではないため、最初に配列内の各サブドキュメントの場所を知る必要があります。

http://www.mongodb.org/display/DOCS/Retrliving+a+Subset+of+Fields#RetrivingaSubsetofFields-RetrifyingaSubrangeofArrayElements

アプリケーションがクエリに一致する埋め込みドキュメントのみを表示するには、プログラムで行う必要があります。

于 2012-01-18T14:49:27.813 に答える
1

あなたは試すことができます:

$results = $mongodb->find(array("visits.payment" => array('$lt' => 30)));

visitsしかし、それがオブジェクトであるため、機能するかどうかはわかりません。ところで、あなたが投稿したものから判断すると、配列に転送できます(または、数値のプロパティ名が混乱を招く傾向があるため)

于 2012-01-17T22:00:42.137 に答える
0

試してください - db.test2.find({"visits.payment":"35"})

于 2016-03-21T15:35:12.053 に答える