Mongodbクエリの特定の月|年、日付ではない 質問する

Mongodbクエリの特定の月|年、日付ではない 質問する

日付範囲ではなく、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日付フィールドの月を表すフィールドを作成し、$match9 月という条件に一致するドキュメントをフィルタリングします。

上記において、$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" })

おすすめ記事