-5

ドキュメントから部分配列を取得するにはどうすればよいですか?

ドキュメントの 1 つを次に示します。

"director_details": {
    "0": {
        "AppointmentDate": "2010-06-02",
        "AppointmentStatus": "CURRENT",
        "AppointmentType": "SEC",
        "NumAppointments": "1",
        "Person": {
            "CountryOfResidence": [],
            "DOB": [],
            "Forename": "MARK JHONSONE",
            "Nationality": "NATIONALITY UNKNOWN",
            "PersonAddress": {
                "AddressLine": "5 PARSONS STREET",
                "Country": [],
                "County": "WEST MIDLANDS",
                "PostTown": "DUDLEY",
                "Postcode": "DY1 1JJ"
            },
            "PersonID": "CSeJxNkEELgkAQhe/9CvFerlpZsK0IFUSEUFZH2dyxlnK1XY3897mG5WV48/HezDDYf2cP4wVS8VwsTHuETANEkjMurgvzGK2HM9PwyQDfoW4qLQpV0rJSBGHr32he1gUQu6WtxIzLNJcgaAZkF+y3 [...]",
            "Surname": "WESTWOOD",
            "Title": "MR"
        }
    },
    "1": {
        "AppointmentDate": "2010-06-02",
        "AppointmentStatus": "CURRENT",
        "AppointmentType": "DIR",
        "NumAppointments": "1",
        "Occupation": "DIRECTOR",
        "Person": {
            "CountryOfResidence": "UNITED KINGDOM",
            "DOB": "1979-11-30",
            "Forename": "MARK DAVID",
            "Nationality": "BRITISH",
            "PersonAddress": {
                "AddressLine": "5 PARSONS STREET",
                "Country": [],
                "County": "WEST MIDLANDS",
                "PostTown": "DUDLEY",
                "Postcode": "DY1 1JJ"
            },
            "PersonID": "CSeJxNkN0KgkAQhe97CvG+XCt/gm0jqCAihLK6lE3HWsp129XIt881TG+GMx9nZg6DF5/sabxBKpbzuWmPkGkAj/OE8dvcPIWboW8aCzLAD6jqSoVQBS1KRRC2ukbzohJAxg1tJE6YTHMJnGZA9svD [...]",
            "Surname": "WESTWOOD",
            "Title": "MR"
        }
    }
}

名に「デビッド」が含まれ、姓と役職が空でない監督を検索したいです。

非常にうまく機能するクエリがありますが、出力から削除したい余分なサブ配列も返します。

4

1 に答える 1

3

Ok。ドキュメントが次のとおりであるとします。

{
    "director_details": {
        "0": {
            "AppointmentDate": "2010-06-02",
            ...
        },
        "1": {
            "AppointmentDate": "2010-06-02",
            ...
            }
        }
    }
}

まず第一にdirector_details、あなたの質問は配列ではなく、オブジェクトです。そして、いくつかの理由でdirector_details.Person.Forename: /david/ 一致しません:

  1. オブジェクトのグラフの一部が欠落しています。パスForenameは ですdirector_details.1.Person.Forename
  2. MongoDB の正規表現は、デフォルトで大文字と小文字が区別されます。フラグを切り替えiて、大文字と小文字を区別しないようにする必要があります。

一致する正しいクエリは次のとおりdb.directors.find({"director_details.1.Person.Forename" : /DAVID/})です。0現在のデータ モデルでは、またはを指定する必要があるため、まったく柔軟ではありません1

director_details次のような配列を作成することを検討してください。

{
    "director_details": [
        {
            "AppointmentDate": "2010-06-02",
            ...
        },
        {
            "AppointmentDate": "2010-06-02",
            ...
        }
    ]
}

この場合、クエリは非常に単純です。

db.directors.find({}, {"director_details" : {$elemMatch : {"Person.Forename" : /DAVID/}}})

そして、これを実行した結果が次のとおりです。

> db.directors.find({}, {"director_details" : {$elemMatch : {"Person.Forename" : /DAVID/}}}).pretty()
{
        "_id" : ObjectId("52455db9cafed39bf0dee631"),
        "director_details" : [
                {
                        "AppointmentDate" : "2010-06-02",
                        "AppointmentStatus" : "CURRENT",
                        "AppointmentType" : "DIR",
                        "NumAppointments" : "1",
                        "Occupation" : "DIRECTOR",
                        "Person" : {
                                "CountryOfResidence" : "UNITED KINGDOM",
                                "DOB" : "1979-11-30",
                                "Forename" : "MARK DAVID",
                                "Nationality" : "BRITISH",
                                "PersonAddress" : {
                                        "AddressLine" : "5 PARSONS STREET",
                                        "Country" : [ ],
                                        "County" : "WEST MIDLANDS",
                                        "PostTown" : "DUDLEY",
                                        "Postcode" : "DY1 1JJ"
                                },
                                "PersonID" : "CSeJxNkN0KgkAQhe97CvG+XCt/gm0jqCAihLK6lE3HWsp129XI",
                                "Surname" : "WESTWOOD",
                                "Title" : "MR"
                        }
                }
        ]
}
于 2013-09-27T10:33:08.953 に答える