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" })