1

I am working on inserting an element inside an array which is inside an object which is inside an array.

{
  "_id": "63206e8cc876d082460e33c3",
  "MessageTrackingId": "08eab450-a2bd-408a-afab-be9ea665503e",
  "RequestMessageLog": {
    "ResponseMessageLog": {
      "LogDateTime": "2022-09-13T11:50:36.426Z"
    },
    "LogDateTime": "2022-09-13T11:50:36.333Z",
    "StatusCode": "Success",
    "BiDirectionalMessageLogs": [
      {
        "MessageTrackingId": "bb7b5573-15ae-4db9-a67e-6862f31b9437",
        "RequestMessageLog": {
          "ResponseMessageLog": {
            "ResponseMessageActionLogs": [
              {
                "LogDateTime": "2022-09-13T11:53:42.478Z",
                "Contents": "something"
              }
            ],
            "LogDateTime": "2022-09-13T11:53:42.477Z"
          },
          "LogDateTime": "2022-09-13T11:53:42.477Z",
          "StatusCode": "Success",
          "BiDirectionalMessageLogs": null
        }
      }
    ]
  }
}

I am trying to insert data into the RequestMessageLog.BiDirectionalMessageLogs.RequestMessageLog.ResponseMessageLog.ResponseMessageActionLogs array but I am unable to do so.

So far I have tried:

FilterDefinition<MessageLog> filter = Builders<MessageLog>.Filter.Eq(e => e.MessageTrackingId, "08eab450-a2bd-408a-afab-be9ea665503e");
filter &= Builders<MessageLog>.Filter.Eq("RequestMessageLog.BiDirectionalMessageLogs.MessageTrackingId", "bb7b5573-15ae-4db9-a67e-6862f31b9437");

UpdateDefinition<MessageLog> update = Builders<MessageLog>.Update.Push("RequestMessageLog.BiDirectionalMessageLogs.RequestMessageLog.ResponseMessageLog.$.ResponseMessageActionLogs", responseMessageActionLog);

but I get the following error:

A write operation resulted in an error. WriteError: { Category : "Uncategorized", Code : 28, Message : "Cannot create field 'RequestMessageLog' in element {BiDirectionalMessageLogs:[ { MessageTrackingId: "bb7b5573....

I also tried the following code mentioned in another thread

IMongoDatabase Database = client.GetDatabase("Logs");
var cmd = new JsonCommand<BsonDocument>(@"Database.MessageLog.update(
                            {'MessageTrackingId' : '08eab450-a2bd-408a-afab-be9ea665503e', 'RequestMessageLog.BiDirectionalMessageLogs.MessageTrackingId': '4dc1f99c-b465-4170-9fef-c78cf5e92216'},
                            {$push:{'RequestMessageLog.BiDirectionalMessageLogs.RequestMessageLog.ResponseMessageLog.$.ResponseMessageActionLogs':{'LogDateTime':'2022-09-13T11:53:42.478Z', 'Contents':'something'}}})");

Database.RunCommand(cmd);

I did see Mongo push to array inside array code on this forum but was unable to make it work for C#.

What am I doing wrong here?

Yong Shun
  • 35,286
  • 4
  • 24
  • 46
  • I was able to find an a way albeit less-efficient I first get the full log then gets the specfic element of the outer array and add an entry into the inner array and the update the whole outer array – Muhammad Hamza Sep 13 '22 at 14:39
  • There are multiple arrays in the document. Which element of `RequestMessageLog.BiDirectionalMessageLogs` is relevant? The first one or can there be multiple? – Markus Sep 13 '22 at 14:39
  • @markus the one that matches **BiDirectionalMessageLogs.MessageTrackingId** value. (TrackingID is unique in my case so it can be used as an identifier. Then the one which matches this ID will have a log inserted into **BiDirectionalMessageLogs.RequestMessageLog.ResponseMessageLog.ResponseMessageActionLogs** – Muhammad Hamza Sep 13 '22 at 14:42
  • Is it guaranteed that there is a matching `MessageTrackingId` in `BiDirectionalMessageLogs`? – Markus Sep 13 '22 at 14:45

1 Answers1

1

You have wrongly place the $ positional operator, it should be:

MongoDB query

db.collection.update({
  MessageTrackingId: "08eab450-a2bd-408a-afab-be9ea665503e",
  "RequestMessageLog.BiDirectionalMessageLogs.MessageTrackingId": "bb7b5573-15ae-4db9-a67e-6862f31b9437"
},
{
  $push: {
    "RequestMessageLog.BiDirectionalMessageLogs.$.RequestMessageLog.ResponseMessageLog.ResponseMessageActionLogs": /* responseMessageActionLog */
  }
})

Demo @ Mongo Playground

UpdateDefinition<MessageLog> update = Builders<MessageLog>.Update
     .Push("RequestMessageLog.BiDirectionalMessageLogs.$.RequestMessageLog.ResponseMessageLog.ResponseMessageActionLogs", responseMessageActionLog);
Yong Shun
  • 35,286
  • 4
  • 24
  • 46