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

マルチレベルのオブジェクト値に基づく条件でネストされた配列をフィルタリングし、それらを更新します-MongoDB集計+更新

    集計クエリを作成しました

            db.session.aggregate([
              {
                $unwind:"$Sessions"
              },
              {
                $unwind:"$Sessions.Conversations"
              },
              {
                $unwind:"$Sessions.Conversations.Messages"
              },
              {
                $match:{
                  "Sessions.Id" : "Session01",
                  "Sessions.Conversations.Messages.Direction":{
                    $in:[
                      "inbound", "outbound"
                    ]
                  },
                  "Sessions.Conversations.Messages.Status":{
                    $in:[
                      "sent", "delivered" 
                    ]
                  }
                }
              },
              {
                $group:{
                  "_id":"$Sessions.Conversations.Id",
                  "Messages":{
                    $push:"$Sessions.Conversations.Messages"
                  }
                }
              }
            ]).pretty()
    

    出力

            {
                    "_id" : "Conversation02",
                    "Messages" : [
                            {
                                    "Id" : "Message05",
                                    "Status" : "sent",
                                    "Direction" : "outbound"
                            }
                    ]
            }
            {
                    "_id" : "Conversation01",
                    "Messages" : [
                            {
                                    "Id" : "Message03",
                                    "Status" : "delivered",
                                    "Direction" : "inbound"
                            },
                            {
                                    "Id" : "Message04",
                                    "Status" : "sent",
                                    "Direction" : "outbound"
                            }
                    ]
            }
    

    ドキュメントを更新するには:

    positional-filters を使用しました

            db.session.update(
              {},
              {
                $set:{
                  "Sessions.$[session].Conversations.$[].Messages.$[message].Status":"read"
                }
              },
              {
                "arrayFilters": [{"session.Id":"Session01"},{ "message.Id": "Message05" }] 
              }
            )
    

    これにより、ステータスがreadとして更新されます "session.Id":"Session01"の場合 および"message.Id": "Message05"

    これがお役に立てば幸いです。 :)

    更新

            db.session.update(
              {},
              {
                $set:{
                  "Sessions.$[session].Conversations.$[].Messages.$[message].Status":"read"
                }
              },
              {
                "arrayFilters": [
                  {
                    "session.Id":"Session01"
                  },
                  { 
                    "message.Direction": {
                      $in :[
                        "inbound", 
                        "outbound"
                      ]
                    },
                    "message.Status": {
                      $in :[
                        "sent", 
                        "delivered"
                      ]
                    }
                  }
                ] 
              }
            )
    



    1. Jsonとして返されるYii2オブジェクトデータを取得できません

    2. HerokuでMongoDBのバージョン番号を取得するにはどうすればよいですか?

    3. MongoDBとNode.jsの動的クエリ

    4. Mongo:キーによるクエリを1レベル深く