2016-03-30 9 views
0

mongodbクエリに関する質問があります。MongoDB Query ExpiredItem

{ 
"_id" : ObjectId("56e56d8a5fedaa00532886a4"), 
"UserID" : "89", 
"Trash" : [ 
    { 
     "Type" : "File", 
     "ID" : "56f948a4b9efe604ac217eb1", 
     "ParentFolder" : "0", 
     "ExpiredIn" : ISODate("2016-04-30T14:34:54.649+0000") 
    }, 
    { 
     "Type" : "Folder", 
     "ID" : "57f918a4b8efe604ac227eb5", 
     "ParentFolder" : "0", 
     "ExpiredIn" : ISODate("2016-04-27T14:34:54.649+0000") 
    } 
] 

}

私は有効期限が切れている項目を、必要とします。これどうやってするの?いくつかのmongoクエリは難しいです。

種類

ヘンドリック
+0

「ExpiredIn

答えて

1

集約フレームワークは、そのようなにとって理想的であるとみなします。目的の結果を得るには、次のパイプラインを実行することを検討してください。

pipeline = [ 
    { 
     "$match": { "Trash.ExpiredIn": { "$lte": new Date() } } 
    }, 
    { 
     "$project": { 
      "ExpiredTrashItems": {         
       "$filter": { 
        "input": "$Trash", 
        "as": "el", 
        "cond": { "$lte": [ "$$el.ExpiredIn", new Date() ] } 
       }         
      } 
     } 
    } 
] 
db.collection.pipeline(pipeline) 

上記パイプライン、すなわち、それが基準を満たしていない外側の要素をフィルタリングする特定の条件を満たしている配列を生成するためのMongoDB 3.2に利用可能​​演算子を使用します。

pipeline = [ 
    { 
     "$match": { "Trash.ExpiredIn": { "$lte": new Date() } } 
    }, 
    { 
     "$project": { 
      "ExpiredTrashItems": {        
       "$setDifference": [ 
        { 
         "$map": { 
          "input": "$Trash", 
          "as": "el", 
          "in": { 
           "$cond": [ 
            { "$lte": [ "$$el.ExpiredIn", new Date() ] }, 
            "$$el", 
            false 
           ] 
          } 
         } 
        }, 
        [false] 
       ]         
      } 
     } 
    } 
] 
db.collection.pipeline(pipeline) 

$projectパイプラインステージは、あなたが持っていない文書を削除するようTrash配列をフィルタリング関係を検討し、​​演算子を使用しない代替の解決策については


まだ有効期限が切れている、すなわち、ExpiredInフィールドが現在の日付時刻よりも大きい。このフィルタリングは、$setDifference$mapの演算子で可能になります。

$map演算子は、本質的に、評価された論理の結果として値を保持する新しい配列フィールドを作成し、配列の各要素の部分式に論理を格納します。 $setDifference演算子は、最初のセットに表示され、2番目のセットには表示されない要素を含むセットを返します。すなわち、第1のセットに対して第2のセットの相対補完を実行する。この場合、ExpiredInの日付が現在の日付時間以下、すなわち既に期限切れである要素を有する最終のTrash配列を返します。それはアレイエントリにつき各文書のコピーを生成するように理想的ではないが$unwind演算子を使用するソリューションについて


は、従ってより多くのメモリを使用し、以下を実行し、以前の方法よりも処理に時間がかかります パイプライン:

pipeline = [ 
    { 
     "$match": { "Trash.ExpiredIn": { "$lte": new Date() } } 
    }, 
    { "$unwind": "$Trash" }, 
    { 
     "$match": { "Trash.ExpiredIn": { "$lte": new Date() } } 
    }, 
    { 
     "$group": { 
      "_id": null 
      "ExpiredTrashItems": { "$push": "$Trash" } 
     } 
    } 
] 
db.collection.pipeline(pipeline) 
関連する問題