MongoDB copy a field to another collection with a foreign key

后端 未结 2 1201
花落未央
花落未央 2021-01-18 03:37

I want to copy over the color from user collection to the Car collection. I\'m using a foreign key which is userID.

> db.test1.User.find()
{ \"_id\" : Obj         


        
相关标签:
2条回答
  • 2021-01-18 04:12

    Here are my two cents: you can drop "function(x)". I prefer the following syntax:

    db.source_collection_name.find().forEach(
      doc=>
          db.target_collection_name.update(
            {"_id": doc._id},
            {$set: {"field_to_update": doc.field}}
          )
    )
    

    In your case, something like this should work:

    db.test1.User.find().forEach(
      doc=> 
        db.test2.Car.update( 
          { "userID": doc._id }, 
          { $set: { "color": doc.Color} } 
        ) 
    );
    
    0 讨论(0)
  • 2021-01-18 04:14

    There are several issues with your test set up:

    • Case of field names does not match (you are referencing color instead of Color when copying)
    • Only one of the example foreign keys matches in the target collection: ObjectId('515f7db83f71d6bcb1c41a48')
    • Your update will only affect the first matching document for the "foreign key". This would be fine for a 1:1 relationship, but not a 1:many

    A corrected example taking the above into account (aside from the non-matching keys):

    db.test1.User.find().forEach( 
        function(x) {
            db.test2.Car.update(
                // query 
                { userID: x._id },
    
                // update 
                { $set: { color: x.Color} },
    
                // options:
                { "multi" : true } // Update all matching documents
            );
        }
    );
    

    Which results in setting {color:blue} for the only foreign key that actually matches in the sample documents:

    db.test2.Car.find()
    {
        "_id" : ObjectId("515f84883f71d6bcb1c41a55"),
        "speed" : 202,
        "userID" : ObjectId("515f7db83f71d6bcb1c41a49")
    }
    {
        "_id" : ObjectId("515f84883f71d6bcb1c41a56"),
        "speed" : 193,
        "userID" : ObjectId("515f7db83f71d6bcb1c41a4a")
    }
    {
        "_id" : ObjectId("515f84883f71d6bcb1c41a54"),
        "color" : "blue",
        "speed" : 291,
        "userID" : ObjectId("515f7db83f71d6bcb1c41a48")
    }
    
    0 讨论(0)
提交回复
热议问题