2016-12-12 1 views
0

Voici mes données de collecte d'utilisateurAjouter l'ID utilisateur dans ma collection de profil à l'aide d'agrégation

collection utilisateur

{ 
    "_id" : ObjectId("584bc9ba420a6b189c510af6"), 
    "old_user_id" :1, 
    "name" :"aaa" 
}, 
{ 
    "_id" : ObjectId("9ba420a584bc6b189c59ba42"), 
    "old_user_id" : 2, 
    "name" :"bbb" 
}, 
{ 
    "_id" : ObjectId("59ba4284bc0a6b189c3323w23"), 
    "old_user_id" : 3, 
    "name" :"ccc" 
} 

collection myprofile

{   
    "old_user_id" :1, 
    "name" :"aaa", 
    "number":"123456789" 
}, 
{ 
    "old_user_id" : 2, 
    "name" :"bbb", 
    "number":"678912345" 
}, 
{ 
    "old_user_id" : 3, 
    "name" :"ccc", 
    "number":"673458912"  
}, 
{ 

    "old_user_id" : 2, 
    "name" : "bbb", 
    "adress" : "afsfdidhddk" 
} 

Mon attente:

J'ai besoin de faire correspondre old_user_id dans les deux collections et mettre à jour la collection user '_id' dans ma collection profile

{ 
    "userid":"584bc9ba420a6b189c510af6", 
    "old_user_id" :1, 
    "name" :"aaa", 
    "number":"123456789" 
}, 
{ 
    "userid":"9ba420a584bc6b189c59ba42", 
    "old_user_id" : 2, 
    "name" :"bbb", 
    "number":"678912345" 
}, 
{ 
    "userid":"59ba4284bc0a6b189c3323w23", 
    "old_user_id" : 3, 
    "name" :"ccc", 
    "number":"673458912" 
}, 
    { 

    "old_user_id" : 2, 
    "name" : "bbb", 
    "adress" : "afsfdidhddk" 
    "userid" : "9ba420a584bc6b189c59ba42" 
} 

Répondre

1

Mise à jour:

db.user.find().forEach(function (user) { 

    var cursor = db.myprofile.find({"old_user_id": user.old_user_id}); 

    cursor.forEach(function(myprofile) { 
     myprofile.userid = user._id.str; 
     db.myprofile.save(myprofile); 
    }); 
}); 

Résultat:

db.myprofile.find().pretty() 

    { 
    "_id" : ObjectId("584e7294678ae15db4fab039"), 
    "old_user_id" : 1, 
    "name" : "aaa", 
    "number" : "123456789", 
    "userid" : "584e7294678ae15db4fab035" 
} 
{ 
    "_id" : ObjectId("584e7294678ae15db4fab03a"), 
    "old_user_id" : 2, 
    "name" : "bbb", 
    "number" : "678912345", 
    "userid" : "584e7294678ae15db4fab036" 
} 
{ 
    "_id" : ObjectId("584e7294678ae15db4fab03b"), 
    "old_user_id" : 3, 
    "name" : "ccc", 
    "number" : "673458912", 
    "userid" : "584e7294678ae15db4fab037" 
} 
{ 
    "_id" : ObjectId("584e7294678ae15db4fab03c"), 
    "old_user_id" : 2, 
    "name" : "bbb", 
    "adress" : "afsfdidhddk", 
    "userid" : "584e7294678ae15db4fab036" 
} 

Note: les fiels _id apparaît encore dans les documents obtenus, mais tu devrais pouvoir vivre avec ça. Est un comportement par défaut de MongoDB. Vous pouvez créer une collection sans champ _id indexé like in here: db.createCollection("user", { autoIndexId: false })

+0

vérifier ma question si j'ai "old_user_id": 2 plusieurs fois son ne fonctionne pas –

+0

je veux mettre à jour myprofile pas utilisateur –

+0

En effet, corrigé. Maintenant cela devrait fonctionner pour plus de documents ayant le même 'old_user_id'. – sergiuz

1

Vous pouvez utiliser l'agrégation mongo. L'utilisation de $ lookup, $ project et $ unwind aidera. J'ai formulé la requête, espérons que cette aide:

db.myprofile.aggregate([ 
    { 
     $lookup: 
     { 
      from: "user", 
      localField: "old_user_id", 
      foreignField: "old_user_id", 
      as: "inventory_docs" 
     } 
    }, 
    { $project : { _id : "$inventory_docs._id", 
        old_user_id:"$old_user_id", 
       "name":"$name", 
       "number":"$number" } }, 
    {$unwind: "$_id"} 
]) 
+0

http://stackoverflow.com/questions/41124705/based-on-value-how-to-create-new-document-using-node-js-mongodb –