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

mongodbでのチャット会話から最後のメッセージを取得する方法

    問題は、メッセージがどのようにstoredです。 。

    保存されたデータ:

    fromUser 123 and toUser 456
    fromUser 456 and toUser 123
    

    したがって、グループ化すると、論理的に同じになります。 、ただしnot for grouping

    解決策:

    送信者/受信者が常に同じように来るようにする必要があります

    1. Create array where we store sender / receiver
    2. Order that array `[123, 456] [456, 123] => [123,456], [123,456]`
    3. Group by this ordered array (In Mongo way: $project, $unwind, $sort, $group - push)
    
    db.chats.aggregate([
      {
        $match: {
          $or: [
            {
              "toUser": 123
            },
            {
              "fromUser": 123
            }
          ]
        }
      },
      {
        "$project": {
          toUser: 1,
          fromUser: 1,
          message: 1,
          timeStamp: 1,
          fromToUser: [
            "$fromUser",
            "$toUser"
          ]
        }
      },
      {
        $unwind: "$fromToUser"
      },
      {
        $sort: {
          "fromToUser": 1
        }
      },
      {
        $group: {
          _id: "$_id",
          "fromToUser": {
            $push: "$fromToUser"
          },
          "fromUser": {
            "$first": "$fromUser"
          },
          "toUser": {
            "$first": "$toUser"
          },
          "message": {
            "$first": "$message"
          },
          "timeStamp": {
            "$first": "$timeStamp"
          }
        }
      },
      {
        "$sort": {
          "timeStamp": -1
        }
      },
      {
        "$group": {
          "_id": "$fromToUser",
          "fromUser": {
            "$first": "$fromUser"
          },
          "toUser": {
            "$first": "$toUser"
          },
          "message": {
            "$first": "$message"
          },
          "timeStamp": {
            "$first": "$timeStamp"
          }
        }
      }
    ])
    

    結果

    [
      {
        "_id": [
          101,
          123
        ],
        "fromUser": 123,
        "message": "Kk",
        "timeStamp": "2019-10-09 18:31:12:1212 PM +05:30",
        "toUser": 101
      },
      {
        "_id": [
          123,
          456
        ],
        "fromUser": 123,
        "message": "2",
        "timeStamp": "2019-10-09 18:31:21:2121 PM +05:30",
        "toUser": 456
      }
    ]
    

    MongoPlayground




    1. HerokuにデプロイするときにTravisがRediscache_storeを使用して接続に失敗するのはなぜですか?

    2. mongoDB updateManyは、upserttrueおよび$inをwhere条件で使用します

    3. Robomongo:$groupのメモリ制限を超えました

    4. PyMongoAggregateのexecutionStatsの取得方法