skip to Main Content

I have an existing document and I wish to add a unique Object Id to each of the transaction Array Objects.

{
_id: ObjectId(6086d7e7e39add6a5220d0a5),
firstName: "John"
lastName: "Doe"
transactions: [
  {
    date: 2022-04-12T09:00:00.000+00:00
    amount: 286.56
    type: "deposit"
    method: "Bank transfer"
  },
  {
    date: 2022-04-15T09:00:00.000+00:00
    amount: 120.23
    type: "withdrawal"
    method: "cash"
  }]
}

The outcome would be each transactions Object would have a unique ObjectId. I have tried the following query but it add the same ObjectId to all objects:

collection.updateMany({}, [
  {
    $set: {
      transactions: {
        $map: {
          input: "$transactions",
          in: {
            $mergeObjects: ["$$this", { _id: new mongo.ObjectId() }],
          },
        },
      },
    },
  },
]);

Can anyone see why I am getting the same ObjectId written to all of the Objects in the transactions array instead of unique Ids?

2

Answers


  1. The code new mongo.ObjectId() will run on the driver => 1 id for all.
    You need the js to run on the server, one time for each member.

    Try to replace the new mongo.ObjectId() with the bellow $function code that will run on the server.
    In general we should avoid javascript, but i don’t think we have an aggregate operator that generates ObjectId’s.

    Another alternative is to write all the $map function in javascript, again with the use of $function.

    *$function requires MongoDB >=4.4

    {
      "$function": {
        "body": "function () {return new ObjectId();}",
        "args": [],
        "lang": "js"
      }
    }
    
    Login or Signup to reply.
  2. the _id field in a document cannot be modified.in fact you are tying to modify main objectid.
    try another name for your transaction_id field.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search