4

MongoDB を学習しようとしていますが、これを行う方法がわかりません。

次のような 3 つのオブジェクトがあるとします。

         {
            "_id": 99990,
            "type" : 15,
            "attributes": [
                {
                    "id": 1,
                    "value": 115
                }
            ]
        },
        {
            "_id": 99991,
            "type" : 5,
            "attributes": [
                {
                    "id": 1,
                    "value": 120
                }
            ]
        },
        {
            "_id": 99992,
            "type" : 5,
            "attributes": [
                {
                    "id": 1,
                    "value": 120
                }
            ]
        },
        {
            "_id": 99993,
            "type" : 5,
            "attributes": [
                {
                    "id": 1,
                    "value": 150
                }
            ]
        },

値が 150 の属性「id」 1 に基づいてアイテムを検索し、id 99993 のみを返すにはどうすればよいですか? 今日MongoDBを使い始めたばかりなので、これはおそらく非常に基本的な質問です。

課題に加えて、タイプ 5 のすべてのアイテムの結果を属性/ID/値でグループ化し、次のような結果を得るにはどうすればよいですか?

 "id" : 1, "value" : 150, "count" : 1
 "id" : 1, "value" : 120: "count" : 2

これは単なるサンプル データです。スキーマはかなり複雑ですが、この演習の目的には十分なはずです。

4

2 に答える 2

7

最初の部分では、次のようにしてそのレコードを取得できるはずです。

db.collectionName.find({"attributes.id": 1, "attributes.value": 150});

これにより、id = 1 および value = 150 の属性配列の要素を持つオブジェクトから _id フィールドのみが取得されます。

質問の 2 番目の部分では一致の数を返す必要があるため、map-reduceを使用してオプションを調べる必要があります。単純な Mongo クエリでその結果を生成することはできません。

于 2012-04-12T01:56:21.150 に答える
1

「attributes」はオブジェクトの配列であるため、クエリで「$elemMatch」を使用する必要があります。

db.collectionName.find(
   {
       "attributes" : {
           $elemMatch : {
               "id" : 1, 
               "value": 150
           }
       }
   }
);

@clexmond が提案したクエリを使用している場合、以下のサンプル ドキュメントも返されますが、これは正しくありません。

   {
        "_id": 99999,
        "type" : 5,
        "attributes": [
            {
                "id": 1,
                "value": 170
            },
            {
                "id": 2,
                "value": 150
            }
        ]
    }

質問の 2 番目の部分は、私もわかりません。その答えを見てみたい。すでに持っている場合は共有してください。

于 2018-11-19T06:29:26.760 に答える