Search code examples
carraysmongodbgccmongo-c-driver

mongo c driver update nested array


I am trying to use the mongo c driver to update a nested array inside of a single document. Here is an example test document:

{ 
  "_id" : ObjectId("562416504bacd3940b8b2d5c"), 
  "folder1" : [
    {
      "folder_id" : "5624200d4bacd3940b8b2d62", 
      "some" : "data"
    }, 
    {
      "folder_id" : "562940084bacf60575d3b17e", 
      "some" : "data"
    }
  ], 
  "folder2" : [
    {
      "folder_id" : "5627e20d4bacefccf4864e4e", 
      "some" : "data"
    }
  ]
}

I want to iterate through both "folder1" and "folder2" looking for any "folder_id" that match a specific string (EX: 5624200d4bacd3940b8b2d62). Then I wish to remove that entire element from the array. So after removal my document should look like:

{ 
  "_id" : ObjectId("562416504bacd3940b8b2d5c"), 
  "folder1" : [
    {
      "folder_id" : "562940084bacf60575d3b17e", 
      "some" : "data"
    }
  ], 
  "folder2" : [
    {
      "folder_id" : "5627e20d4bacefccf4864e4e", 
      "some" : "data"
    }
  ]
}

I know how to modify a single element in the document, example below. But I have not found any good examples of iterating through nested array elements.

update = BCON_NEW ("$set", "{","some_cool_key", BCON_UTF8 ("some cool data for key"),"}");
mongoc_collection_update (collection, MONGOC_UPDATE_NONE, query, update, NULL, &error);

Solution

  • I want to give credit to John Moore @ ObjectRocket for helping me with this. He provided a simple one-line BCON that does exactly what I need:

    update = BCON_NEW ("$pull", "{", "folder1", "{", "folder_id", BCON_UTF8 ("5624200d4bacd3940b8b2d62"), "}", "}");