sql >> データベース >  >> NoSQL >> MongoDB

マングースの集計は入力日でフィルタリングされません

    マングースには、「自動キャスト」と呼ばれるこの魔法のことを行う「スキーマ」があります。ここで設計者が念頭に置いている典型的なケースは、GETのような「Web」相互作用からのすべての入力です。 およびPOST 基本的に「文字列」に含まれています。

    パラメータをキーと値を持つオブジェクトにするヘルパーがあるかどうかに関係なく、それらの「値」はすべて「文字列」であるか、必要に応じて同じ「ヘルパー」によって直接数値化される可能性があります。これは一般的なWebフレームワークの設計です。

    したがって、.find()を発行すると 、この関数は完全に機能しません フィールド/プロパティの省略以外の方法で返されたコンテンツを変更するため、「スキーマ」が適用されます。

    .aggregate() メソッドは完全にです 違う。存在全体は変更することです ドキュメントとコレクションに含まれるコンテンツ。この結果、スキーマを適用することは「不可能」になります。

    したがって、.find()などのメソッドに存在する「自動キャスト」 発生しません 、および要素(「文字列」、「日付」が送信されるなど)を自分で正しいタイプにキャストする必要があります:

    Reservation.aggregate([
       { "$match": { "createdAt": { "$lte": new Date(req.endDate) } } }
    ])
    

    $matchだけをしている場合でも また、スキーマを「変更」していない場合、mongooseはこれを「推定」せず、スキーマ内の一致するフィールドにキャストしようとしません。

    ここでのロジックは、$match 「タイプ」にバインドできるステージまたは同様のものは、パイプライン内のどこでも発生する可能性があります。そのため、パイプラインステージによって処理されるドキュメントが、元のコレクションスキーマと類似しているという保証はありません。

    おそらくそれは「できた」 おそらくこれがであるという事実を考慮してください 何も変更されていない可能性があり、同様の検査を行う最初のパイプラインステージ。しかし、それは現在のコードベースがどのように機能したかではありません。

    つまり、集計パイプラインを使用する場合、タイプ(Date、ObjectIdなど)に具体的にキャストする必要があるすべてのオブジェクトは、マングースが自動的にキャストするのではなく、コードで「手動で」キャストする必要があります。他の方法と同じように。




    1. SignalR Core-エラー:WebSocketがステータスコードで閉じられました:1006

    2. MongoDB $ atanh

    3. MongoDB $ anyElementTrue

    4. BasicDBObjectから値を抽出するMongoDB(Java)