2017-03-27 1 views
0

Je veux juste savoir mettre à jour tous les documents incorporés. Voici mon document:Comment mettre à jour plusieurs documents imbriqués/incorporés mongodb?

{ 
"_id":1, 
"chat":[ 
{ "sender":"bar", 
"message":"Hi", 
"status":"pending" 
}, 
{ "sender":"bar", 
"message":"How are you?", 
"status":"pending" 
} 
} 
{ 
"_id":2, 
"chat":[ 
{ "sender":"foo", 
"message":"Hello", 
"status":"pending" 
}, 
{ "sender":"foo", 
"message":"Are you okay?", 
"status":"pending" 
}, 
{ "sender":"someone", 
"message":"Where are you?", 
"status":"pending" 
} 
} 

J'ai essayé mais cela n'a pas pu fonctionner simultanément, cela fonctionne simplement pour changer le premier document incorporé. Voici mon code:

db.chat.update({"_id":"2", "chat.sender":"foo"},{$set{"chat.$.status":"sent"}},{multi:true}) 

Je veux document est mis à jour pour être comme ça et il devrait avoir changé en 1 processus en même temps:

{ 
"_id":1, 
"chat":[ 
{ "sender":"bar", 
"message":"Hi", 
"status":"pending" 
}, 
{ "sender":"bar", 
"message":"How are you?", 
"status":"pending" 
} 
} 
{ 
"_id":2, 
"chat":[ 
{ "sender":"foo", 
"message":"Hello", 
"status":"sent" 
}, 
{ "sender":"foo", 
"message":"Are you okay?", 
"status":"sent" 
}, 
{ "sender":"someone", 
"message":"Where are you?", 
"status":"pending" 
} 
} 

Si vous savez comment résoudre ce problème, s'il vous plaît aidez-moi ...

Répondre

0

C'est ce que vous cherchez.

db.chat.find({ "_id":2 }) 
    .forEach(function (doc) { 
    doc.chat.forEach(function (ch) { 
     if (ch.sender === "foo") { 
     ch.status="sent"; 
     } 
    }); 
    db.chat.save(doc); 
    }); 
+0

Omg cela fonctionne monsieur, mais comment implémenter en PHP? db-> chat-> find (array ("_ id" => "2")) et ensuite? –

+0

De rien. Désolé mais je ne peux pas vous aider à propos de PHP. Il doit y avoir un moyen d'utiliser cette requête dans la bibliothèque mongodb php. –

+0

@ Hasan trouver la condition devrait être: {"_id": 2}, faites éditer vos ans. – radhakrishnan

0

Je pense, vous avez besoin de celui-ci. essayez comme ceci,

db.chat.find({"_id":2, 
    chat: { 
     $exists: true 
    } 
}).forEach(function(myDoc) { 
    var child = myDoc.chat; 
    for (var i = 0; i < child.length; i++) { 
     var ob = child[i]; 
     if (ob.sender == "foo") { 
      ob.status = "sent"; 
      child[i] = ob; 
     } 
    } 
    db.chat.update({ 
     _id: myDoc._id 
    }, { 
     $set: { 
      chat: child 
     } 
    }); 
    });