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

毎日の最後の記録を探す

    元の答えよりも少し現代的です:

    db.collection.aggregate([
      { "$sort": { "date": 1 } },
      { "$group": {
        "_id": {
          "$subtract": ["$date",{"$mod": ["$date",86400000]}]
        },
        "doc": { "$last": "$$ROOT" }
      }},
      { "$replaceRoot": { "newDocument": "$doc" } }
    ])
    

    同じ原則が、基本的に $ sortにも当てはまります。 コレクション、次に $ group $ last> グループ化境界からのデータ。

    元の記述では、 $$ ROOT を使用できるため、状況が少し明確になっています。 すべてのドキュメントプロパティを指定する代わりに、もちろん $ replaceRoot ステージでは、そのデータを元のドキュメントフォームとして完全に復元できます。

    ただし、一般的な解決策は依然として $ sort 最初に、 $ group 必要な共通キーで、 $last<を保持します。 / code> または $ first 必要なプロパティのグループ化境界からのソート順の発生に応じて。

    また、質問のタイムスタンプ値ではなくBSON日付については、15分の時間間隔で結果をグループ化するを参照してください。 MongoDbで 実際にBSON日付値を使用して返す、さまざまな時間間隔で累積する方法に関するさまざまなアプローチについて。

    ここで何をしようとしているのかよくわかりませんが、私の理解が正しければ、これをまとめて行うことができます。したがって、毎日の最後のレコードを取得するには:

    db.collection.aggregate([
        // Sort in date order  as ascending
        {"$sort": { "date": 1 } },
    
        // Date math converts to whole day
        {"$project": {
            "adco": 1,
            "hchc": 1,
            "hchp": 1,
            "hhphc": 1,
            "ptec": 1,
            "iinst": 1,
            "papp": 1,
            "imax": 1,
            "optarif": 1,
            "isousc": 1,
            "motdetat": 1,
            "date": 1,
            "wholeDay": {"$subtract": ["$date",{"$mod": ["$date",86400000]}]} 
        }},
    
        // Group on wholeDay ( _id insertion is monotonic )
        {"$group": 
            "_id": "$wholeDay",
            "docId": {"$last": "$_id" },
            "adco": {"$last": "$adco" },
            "hchc": {"$last": "$hchc" },
            "hchp": {"$last": "$hchp" },
            "hhphc": {"$last": "$hhphc" },
            "ptec": {"$last": "$ptec" },
            "iinst": {"$last": "$iinst" },
            "papp": {"$last": "$papp" },
            "imax": {"$last": "$imax" },
            "optarif": {"$last": "$optarif",
            "isousc": {"$last": "$isouc" },
            "motdetat": {"$last": "$motdetat" },
            "date": {"$last": "$date" },
        }}
    ])
    

    したがって、ここでの原則は、タイムスタンプ値が与えられた場合、日付計算を実行して、それを毎日の初めの真夜中の時間として予測することです。次に、 _idとして ドキュメントのキーはすでに単調(常に増加)になっているので、 WholeDayでグループ化するだけです。 $ lastをプルしている間の値 グループ化の境界からのドキュメント。

    すべてのフィールドが必要でない場合は、必要なフィールドのみを投影してグループ化します。

    そして、はい、春のデータフレームワークでこれを行うことができます。そこにはラップされたコマンドがあると確信しています。ただし、それ以外の場合、ネイティブコマンドに到達するための呪文は次のようになります。

    mongoOps.getCollection("yourCollection").aggregate( ... )
    

    記録として、タイムスタンプではなく実際にBSONの日付タイプを数値として使用している場合は、日付の計算をスキップできます。

    db.collection.aggregate([
        { "$group": { 
            "_id": { 
                "year": { "$year": "$date" },
                "month": { "$month": "$date" },
                "day": { "$dayOfMonth": "$date" }
            },
            "hchp": { "$last": "$hchp" }
        }}
    ])
    


    1. MongoDBのドキュメントの一括更新

    2. multerを使用してファイルの配列をmongoDBデータベースに保存するにはどうすればよいですか?

    3. GridFs(MongoDb)でのファイルの作成

    4. 次の多対多の関係をMongoDBでどのようにモデル化する必要がありますか?