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