MongoDB 3.6以降では、 $exprを使用できます find()の演算子 クエリ。これにより、 $match内の同じドキュメントのフィールドを比較するクエリ式を作成できます。 ステージ。
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
他のMongoDBバージョンについては、 $redactを使用する集約パイプラインの実行を検討してください。 $projectの機能を単一のパイプラインに組み込むことができるため、演算子 日付フィールドの月を表すフィールドと$matchを作成します 9月である月の特定の条件に一致するドキュメントをフィルタリングします。
上記では、 $redact $condを使用します 墨消しを行うシステム変数を作成する条件式を提供する手段としてのtenary演算子。 $condの論理式 指定された値を持つ日付演算子フィールドが等しいかどうかをチェックします。一致する場合は、 $redact $$KEEPを使用してドキュメントを返します システム変数であり、それ以外の場合は $$PRUNEを使用して破棄します 。
次のパイプラインを実行すると、目的の結果が得られます。
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
これは$projectに似ています + $match コンボですが、パイプラインに入る残りのすべてのフィールドを選択する必要があります:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
別の方法として、クエリは遅くなりますが、 find()を使用します $whereを使用したメソッド として:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })