2017-09-18 12 views
0

商品のコレクションがあります。各製品には履歴項目の配列が含まれています。MongoDBサブ文書の値に基づいて検索結果から文書を除外

{ 
    "_id" : "product1" 
    "name" : "Product 1", 
    "history" : [ 
     { 
       "date" : "2017-09-18 11:49:03.000", 
       "processed" : 0, 
       "status": "New" 
     }, 
     { 
       "date" : "2017-09-18 11:49:03.000", 
       "processed" : 0, 
       "diff": [] 
     } 
    ] 
} 
{ 
    "_id" : "product2" 
    "name" : "Product 2", 
    "history" : [ 
     { 
       "date" : "2017-09-18 11:49:03.000", 
       "processed" : 1, 
       "status": "New" 
     }, 
     { 
       "date" : "2017-09-18 11:49:03.000", 
       "processed" : 0, 
       "diff": [] 
     } 
    ] 
} 
私が新しく追加されたすべての製品を見つけて、次のMongoDBのクエリを使用して処理されていない歴史を持つことができ

db.products.find(
    { 
     "history": { 
      $elemMatch: { 
       "processed": {$eq: 0}, 
       "status": {$eq: "New"} 
      } 
     } 
    } 
) 

しかし、私が見つける方法を見つけ出すことはできませんこれは、駅を持っている履歴項目が含まれていない

  • "processed": {$eq: 0}を処理する必要がある履歴項目があり

    • :もの

    したがって、product1は別の方法で処理する必要があるため、「product1」ではなく「product2」を戻す必要があります。

    すべてのヘルプは非常にあなただけproduct 1に一致する両方processedstatusフィールドのand検索を行っているので、あなただけのproduct 1出力を得ている

  • 答えて

    0

    :-)認識されます。 product 2をアウトにしたい場合は、processedフィールドのみに基づいて、$orクエリを使用する必要があります。

    チェック次のクエリは、両方のproduct 1product 2

    { 
        "history": { 
         $elemMatch: { 
          $or:[ 
           {"processed": {$eq: 0}}, 
           {"status": {$eq: "New"}}] 
         } 
        } 
    } 
    

    はコメント欄にご説明に基づいてクエリを更新しました返されます。

    .find({ 
        $and:[{ 
         "history": { 
          $not: { 
           $elemMatch: { 
            "processed": {$eq: 0}, 
            "status":{$eq: "New"} 
           } 
          } 
         } 
        }, 
        {"history.processed":0} 
    ]}) 
    
    +0

    ご回答ありがとうございます。私は実際に私は私の質問でクエリで行うことができます 'product1'を返すものを2つのクエリ(私はそれらを別々に処理したい)が必要ですが、私は別のクエリベースで' product2'を返す方法を見つけることができませんステータスnewの履歴アイテムが処理されたが、処理されていない別の履歴アイテムがあるという事実に基づいている。私はいつも 'product1'も得ています! – Phil

    +0

    これは常に 'product 1'と' product 2'です。あるいは、他のいくつかのパラメータに対して何らかの問い合わせが必要です。これをもう少し詳しく説明してください。 – Ricky

    +0

    コレクションには、別のシステムからインポートされた1000以上の製品があります。私はこれらをmongoにインポートし、その変更を履歴項目として追跡しています。 - 1番目のクエリ:製品の状態が新しい(これは私の質問でできる)(製品1のみ) - 2番目のクエリ:処理済み= 0にエクスポートする必要がありますが、エクスポートが必要なステータス履歴項目はありません(製品2のみ)。だから私は、処理されたアイテム= 0であり、ステータス=新規のアイテムはどれもありません。 – Phil

    関連する問題