2017-08-28 3 views
1

ドキュメント私だけ_id = 1 & _id = 2が返されるべきであることを意味する「B!= 4」文書のみを取得する必要があります上記の文書からのフォーマット配列内のフィールドがMongoDBの特定の値と等しくないドキュメントをフェッチする方法はありますか?データベースコレクション内

{ 
    _id:1, 
    a: [{b:1, c:2, d:3}, {b:2, c:3, d:4}] 
}, 
{ 
    _id:2, 
    a: [{b:2, c:2, d:4}, {b:3, c:5, d:4}] 
}, 
{ 
    _id:3, 
    a: [{b:4, c:4, d:3}, {b:5, c:3, d:2}] 
} 

の下です。

このため、以下のクエリを試しましたが、期待した結果が得られませんでした。代わりに私はすべての文書を持っています。

db.collectionname.find({a: {$nin: [{b: 4}]}}) 

他の解決策は、私を助けてください。

答えて

3

誤った演算子を使用しています。 **$nin**の代わりに$neを使用してください。 mongodb documentationから

:フィールド値は、フィールドが存在しない場合、指定された配列 または

  • ではありません

    • $ ninが文書を選択します。 {b: 4}

    ので、クエリ

    db.collectionname.find({a: {$nin: [{b: 4}]}}) 
    

    は配列aこの正確な文書を含んでいないとの文書を探します。内部文書にはbcのキーがあり、{b: 4}にはないため、3つの文書が一致しています。

    { "_id" : 1, "a" : [ { "b" : 1, "c" : 2, "d" : 3 }, { "b" : 2, "c" : 3, "d" : 4 } ] } 
    { "_id" : 2, "a" : [ { "b" : 2, "c" : 2, "d" : 4 }, { "b" : 3, "c" : 5, "d" : 4 } ] } 
    
  • +0

    我々は、おそらくことを説明する文章や2を追加できます:単一のフィールドのチェックのために

    、あなたは正しいクエリが

    db.collectionname.find({"a.b": {$ne: 4}}) 

    これが返され$ne

    を使用する必要があります配列にマッチさせるために '$ nin'や' $ in'を使うことは、実際には "逆の方法"です。なぜなら "リストとのマッチング"ではなく "リストの値"を取る演算子なのですから。 OPが '$ nin'に飛び乗ったことを考えれば、なぜ彼らの選択が間違っているのかを実際に説明するのはいいかもしれません。 –

    +0

    説明もありがとう、今私はその違いを理解しています。 –

    関連する問題