recherche

Maison  >  Questions et réponses  >  le corps du texte

mongodb 内嵌数组 批量修改问题

对于一个文档结构为:

{
  "_id" : ObjectId("57133995fb5f8930d0e9b81a"),
  "taskList" : [{
      "taskId" : NumberLong(1),
      "state" : "ST00",
      "createTime" : ISODate("2016-04-17T07:21:58.424Z")
    },{
      "taskId" : NumberLong(2),
      "state" : "ST00",
      "createTime" : ISODate("2016-04-17T07:21:58.424Z")
    },{
      "taskId" : NumberLong(3),
      "state" : "ST00",
      "createTime" : ISODate("2016-04-17T07:21:58.424Z")
    }]
}

taskList 长度不确定

如何批量对数组内容进行修改呢?

例如批量修改 "_id" : ObjectId("57133995fb5f8930d0e9b81a") 的 taskList 内嵌元素 的 state 字段 为 'ST02'

@Mongoing中文社区

曾经蜡笔没有小新曾经蜡笔没有小新2790 Il y a quelques jours1017

répondre à tous(4)je répondrai

  • 習慣沉默

    習慣沉默2017-05-02 09:21:52

    L'instruction update de MongoDB ne peut mettre à jour que le premier élément correspondant du tableau à la fois. Quelques idées :

    1) Remodelez, placez la liste de tâches dans un autre tableau, puis utilisez la référence pour la référencer. Si tu as beaucoup de besoins

    2) Effectuez d’abord une requête pour obtenir la longueur de taskList, puis épelez l’instruction de mise à jour en fonction de cette longueur :

    var length = db.test.aggregate([{$project:{lenOfArray: {$size:"$taskList"}}}]).next().lenOfArray;
    var updateObj = {};
    for(var i=0;i<length;i++){
    updateObj["taskList."+ i+".stat"] = "ST02";
    }
    db.test.update( { }, {$set: updateObj } );

    répondre
    0
  • 仅有的幸福

    仅有的幸福2017-05-02 09:21:52

    Comment mettre un éléphant au réfrigérateur ? Ouvrez la porte, mettez-la dedans, fermez la porte
    Idem. Récupérez ces données, parcourez ce tableau et modifiez-les vous-même ~
    De manière générale, c'est comme ça

    .

    répondre
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-02 09:21:52

    Mongodb ne prend actuellement pas en charge la modification par lots des données intégrées. Actuellement, il ne se met à jour qu'une par une, mais vous pouvez écrire une méthode JS pour l'encapsuler

    .

    répondre
    0
  • 習慣沉默

    習慣沉默2017-05-02 09:21:52

    Comme ci-dessus, utilisez la méthode js pour modifier chaque document et enregistrez-le. L'exemple de code est le suivant. Le sujet doit le tester par lui-même (exécuter dans le shell mongo)

    changeState = function(doc){
        taskList = doc.taskList;
        for(var i in taskList){
            taskList[i].state = 'ST02';
        }
        db.test.save(doc)
    }
     db.test.find({"_id" : ObjectId("57133995fb5f8930d0e9b81a")}).forEach(changeState)
     
     
     

    répondre
    0
  • Annulerrépondre