検索

ホームページ  >  に質問  >  本文

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

曾经蜡笔没有小新曾经蜡笔没有小新2792日前1019

全員に返信(4)返信します

  • 習慣沉默

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

    MongoDB の update ステートメントは、一度に配列内の最初に一致する要素のみを更新できます。いくつかのアイデア:

    1) 再モデル化し、タスクリストを別のテーブルに配置し、reference を使用してそれを参照します。ご要望がたくさんある場合

    2) まずクエリを実行して taskList の長さを取得し、次にこの長さに基づいて update ステートメントを記述します。

    var length = db.test.aggregate([{$project:{lenOfArray: {$size:"$taskList"}}}]).next().lenOfArray;

    var updateObj = {};
    for(var i =0;i updateObj["taskList."+ i+".stat"] = "ST02";
    }
    db.test.update({ }, {$set: updateObj } );

    返事
    0
  • 仅有的幸福

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

    ゾウを冷蔵庫に入れる方法は? ドアを開けて、入れて、ドアを閉めて
    このデータを取得して、この配列をトラバースして、自分で変更して、このデータを保存する〜
    大まかに言うと、こんな感じです

    返事
    0
  • 给我你的怀抱

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

    Mongodb は現在、埋め込みデータのバッチ変更をサポートしていません。現在は 1 つずつ更新するだけですが、それをカプセル化する JS メソッドを作成できます

    返事
    0
  • 習慣沉默

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

    上記と同様に、js メソッドを使用して各ドキュメントを変更し、保存します。コード例は次のとおりです。被験者は自分でテストする必要があります (mongo シェルで実行)

    リーリー

    返事
    0
  • キャンセル返事