2011-01-21 9 views
55

で子オブジェクトを照会するためにどのように私はMongoDBのために新たなんだと子オブジェクトを照会しようとしています。私には州の集まりがあり、各州には子の都市があります。 Citiesの1つにNameプロパティがあり、これはnullです。これはアプリケーションでエラーを引き起こしています。どのようにしてStateコレクションを照会して、名前== nullの子都市を見つけることができますか?MongoDBの

+0

質問は、プログラミング言語/ドライバを使用し、おそらく人々が正しく –

+21

虚偽、私は直接デシベルを照会について聞いてるのよ、その理解に答え両方の人々答えるの文書の例されているかの明確化が必要です。 – Justin

答えて

84

それはまさにnull(設定されていないではなく)の場合:

db.states.find({"cities.name": null}) 

(しかしjavierfpが指摘するように、それはまた全くの都市の配列を持っていない文書にマッチし、私は彼らが行うことを想定しています)。

それはプロパティが設定されていないことをケースの場合:最初のクエリが最初に見つかった

db.states.insert({"cities": [{name: "New York"}, {name: null}]}) 
db.states.insert({"cities": [{name: "Austin"}, {color: "blue"}]}) 

db.states.find({"cities.name": {"$exists": false}}) 

私はこれらの2回の挿入で作成されたコレクションで上記をテストしてみました2番目のクエリは2番目のクエリを検出します。

db.states.find({"$or": [ 
    {"cities.name": null}, 
    {"cities.name": {"$exists": false}} 
]}) 
22

はあなたの「状態」コレクションが似ていると仮定すると::

{"name" : "Spain", "cities" : [ { "name" : "Madrid" }, { "name" : null } ] } 
{"name" : "France" } 

クエリをヌル都市との状態は以下のようになり見つけるために使用すると、1つのクエリでそれらの両方を検索したい場合は、$orクエリを作ることができます:

db.states.find({"cities.name" : {"$eq" : null, "$exists" : true}}); 

それのようにヌルを照会するのが一般的間違いです:

db.states.find({"cities.name" : null}); 

このクエリは、キーを欠いているすべての文書を返しますので、(この例では、それはスペインとフランスを返します)。したがって、キーが常に存在することが確実でない場合は、最初のクエリーのようにキーが存在することを確認する必要があります。