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

对于一个文档结构为:

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

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

全員に返信(4)
習慣沉默

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
仅有的幸福

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

いいねを押す +0
给我你的怀抱

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

いいねを押す +0
習慣沉默

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

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート