mongodb 内嵌数组 批量修改问题
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-05-02 09:19:52
0
4
1003

对于一个文档结构为:

{
  "_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中文社区

曾经蜡笔没有小新
曾经蜡笔没有小新

répondre à tous(4)
習慣沉默

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 } );

仅有的幸福

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

.
给我你的怀抱

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

.
習慣沉默

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)
 
 
 
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal