2

example多次元配列で値を検索する方法、たとえば、コマンドからすべてのデータをフェッチするために使用したmongodbの次のデータでキーワードを検索したい

>db.info.find()

{
    "_id" : ObjectId("4f74737cc3a51043d26f4b90"),
    "id" : "12345",
    "info" : [
            {
                    "sno" : 1,
                    "name" : "ABC",
                    "email" : "abc@example.com"
            },
            {
                    "sno" : 2,
                    "name" : "XYZ",
                    "email" : "xyz@example.com"
            },
            {
                    "sno" : 3,
                    "name" : "XYZ",
                    "email" : "xyz@demo.com"
            },
            {
                    "sno" : 4,
                    "name" : "ABC",
                    "email" : "abc@demo.com"
            },
            {
                    "sno" : 5,
                    "name" : "Rohan",
                    "email" : "rohan@example.com"
            }
    ]
}

example今、私がコマンドを使用したデータを見つけるために

>db.info.find({"info.email":"example"}) そしてそれは与える

{
    "_id" : ObjectId("4f74737cc3a51043d26f4b90"),
    "id" : "12345",
    "info" : [
            {
                    "sno" : 1,
                    "name" : "ABC",
                    "email" : "abc@example.com"
            },
            {
                    "sno" : 2,
                    "name" : "XYZ",
                    "email" : "xyz@example.com"
            },
            {
                    "sno" : 3,
                    "name" : "XYZ",
                    "email" : "xyz@demo.com"
            },
            {
                    "sno" : 4,
                    "name" : "ABC",
                    "email" : "abc@demo.com"
            },
            {
                    "sno" : 5,
                    "name" : "Rohan",
                    "email" : "rohan@example.com"
            }
    ]
}

しかし、私は次のような5つのサブ行のうち3つだけが必要です

{
    "_id" : ObjectId("4f74737cc3a51043d26f4b90"),
    "id" : "12345",
    "info" : [
            {
                    "sno" : 1,
                    "name" : "ABC",
                    "email" : "abc@example.com"
            },
            {
                    "sno" : 2,
                    "name" : "XYZ",
                    "email" : "xyz@example.com"
            },
            {
                    "sno" : 5,
                    "name" : "Rohan",
                    "email" : "rohan@example.com"
            }
    ]
}
4

4 に答える 4

2

Rohan、MongoDBは常に、検索しているドキュメント全体を返します。キーワードが見つかった配列要素を返すようにすることはできません。これを行う場合は、「情報」フィールドに埋め込まれているすべてのドキュメントが独自のコレクションに含まれていることを確認する必要があります。そして、それはあなたがそれらをあなたの「情報」コレクションの元の文書にリンクして戻す必要があることを意味するかもしれません。おそらく次のようなものです:

{
    "sno" : 1,
    "name" : "ABC",
    "email" : "abc@example.com"
    "info_id" : "12345",
},

または、もちろんPHPで後処理を実行して、必要な行のみを取得することもできます。

于 2012-04-06T10:33:18.793 に答える
1

Map Reduce関数を試しましたが、このタイプの問題で機能し、コードは次のようになります。

マップ関数を書く

  map=function () 
  {
      filter = [];
      this.info.forEach(function (s) {if (/example/.test(s.email)) {filter.push(s);}});
      emit(this._id, {info:filter});
  }

削減関数を書く

  reduce=function(key, values) { return values;}

MapReduce関数

  res=db.info.mapReduce(map,reduce,{out:{inline:1}})

そして、出力は次のようになります。

"results" : [
    {
            "_id" : ObjectId("4f9a2de0ea4a65c3ab85a9d3"),
            "value" : {
                    "info" : [
                            {
                                    "sno" : 1,
                                    "name" : "ABC",
                                    "email" : "abc@example.com"
                            },
                            {
                                    "sno" : 2,
                                    "name" : "XYZ",
                                    "email" : "xyz@example.com"
                            },
                            {
                                    "sno" : 5,
                                    "name" : "Rohan",
                                    "email" : "rohan@example.com"
                            }
                    ]
            }
    }
    ],
    "timeMillis" : 1,
    "counts" : {
            "input" : 3,
            "emit" : 3,
            "reduce" : 0,
            "output" : 3
    },
    "ok" : 1,

今、あなたはからあなたの検索データを見つけることができます

   printjson(res.results)
于 2012-04-27T05:49:19.983 に答える
1

おそらくこれは良い考えですか? http://php.net/manual/en/class.mongoregex.php

于 2012-04-06T10:23:32.797 に答える
0

$(プロジェクション)を試しましたか?

db.info.find({"info.email":"example"}, {"info.email.$":1})

資料

于 2013-11-07T07:17:03.297 に答える