日付範囲ではなく、mongodb で特定の月をクエリするにはどうすればよいですか。現在の月の顧客誕生日のリストを作成するには月が必要です。
SQL では次のようになります:
SELECT * FROM customer WHERE MONTH(bday)='09'
次に、それを mongodb で翻訳する必要があります。注: 日付はすでに MongoDate 型に保存されています。以前は簡単に操作できると思ってこれを使用しましたが、今ではこの簡単な操作方法を簡単に見つけることができません。
ベストアンサー1
MongoDB 3.6以降では、$expr
あなたのfind()
クエリ。これにより、同じドキュメントのフィールドを$match
ステージ。
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
他のMongoDBバージョンでは、$redact
演算子を使用すると、単一のパイプラインで、$project
日付フィールドの月を表すフィールドを作成し、$match
9 月という条件に一致するドキュメントをフィルタリングします。
上記において、$redact
用途$cond
十項演算子は、編集を行うシステム変数を作成する条件式を提供する手段として使用されます。$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" })