Home > Software design >  MongoDb how change id of document to diffrent
MongoDb how change id of document to diffrent

Time:03-31

Hello how to change an id of document to diffrent when some ids are equal? I want to change some of employees id_director to object id thats is equal to id_director. I mean for example, when some document have id_director = 100 then changed it to _id with value of employee where id_employee = 100.

I was trying like this:

var employes = db.employees.find({"id_director": {$ne: null}});
while (employes.hasNext()) {
emp = employes.next();
employe = db.employees.findOne({"id_director":emp.id_employe});


emp.id_director = employe._id

db.employees.save(emp)

}

For example

I have two documents in one collection:

employees
{
    "_id" : ObjectId("6224a5767b9cdbdcb681b1ef"),
    "id_employe" : 180,
    "id_director" : 100,
    "name" : "Mark"
}

{
    "_id" : ObjectId("6224a5767b9cdbdcb681b1f0"),
    "id_employe" : 100,
    "id_director" : null,
     "name" : "Peter"
}

Expected document:

{
    "_id" : ObjectId("6224a5767b9cdbdcb681b1ef"),
    "id_employe" : 180,
    "id_director" : ObjectId("6224a5767b9cdbdcb681b1f0"),
    "name" : "Mark"
}

CodePudding user response:

first of all you need to have peter's id then update mark document:

var peter= db.employees.findOne({_id: peterId});
db.employees.updateOne({
    _id: markId
}, {
    $set: {
        id_director: peter._id
    }
})

CodePudding user response:

You can perform a self $lookup to lookup for the director_id, then perform some wrangling and $merge back to the collection.

db.collection.aggregate([
  {
    "$match": {
      "id_director": {
        $ne: null
      }
    }
  },
  {
    "$lookup": {
      "from": "collection",
      "localField": "id_director",
      "foreignField": "id_employe",
      pipeline: [
        {
          "$limit": 1
        },
        {
          $project: {
            _id: 1
          }
        }
      ],
      "as": "id_director"
    }
  },
  {
    $unwind: "$id_director"
  },
  {
    $project: {
      _id: 1,
      id_employe: 1,
      id_director: "$id_director._id",
      name: 1
    }
  },
  {
    "$merge": {
      "into": "collection",
      "on": "_id",
      "whenMatched": "replace"
    }
  }
])

Here is the Mongo playground for your reference.

  • Related