Mongo 根据索引更新数组中的字段

Mongo update field in array based on index

我有一个项目集合 (Projects),其中有一条记录 project,其中有一个数组 equipInfo,假设我想更新数组中索引 1 的数量:

"techInfo" : {    
    "equipInfo" : [ 
                {
                    "item" : {
                        "$ref" : "equipment",
                        "$id" : ObjectId("581a20cb4abab607fd17f07d")
                    },
                    "quantity" : "22800",
                    "type" : "module"
                }, 
                {
                    "item" : {
                        "$ref" : "equipment",
                        "$id" : ObjectId("581a20cb4abab607fd17f07e")
                    },
                    "quantity" : "1666",   <===== UPDATE THIS!!!!!!
                    "type" : "inverter"
                }
        ]
}

所以我尝试了:

    Projects.update(
        {_id: projectId},
        {$set: {"techInfo.equipInfo.1.quantity": 1000000}
    );

但这不起作用,我正在使用 Meteor.js 顺便说一句

我想你需要这个:

Projects.update(
    {_id: projectId},
    {$set: {"techInfo.equipInfo.1.quantity": 1000000}
);

"this doesn't work" 是什么意思?有错误吗?

以下按预期工作,如新流星项目中的 /server/main.js:

import { Meteor } from 'meteor/meteor';
import { Mongo  } from 'meteor/mongo'

Projects = new Mongo.Collection("projects");

Meteor.startup(() => {
    Projects.remove({})
    Projects.insert( {
        "techInfo": {
            "equipInfo": [{
                    "item": {
                        "$ref": "equipment",
                        "$id": new Mongo.ObjectID("581a20cb4abab607fd17f07d")
                    },
                    "quantity": "22800",
                    "type": "module"
                },
                {
                    "item": {
                        "$ref": "equipment",
                        "$id": new Mongo.ObjectID("581a20cb4abab607fd17f07e")
                    },
                    "quantity": "1666",
                    "type": "inverter"
                }
            ]
        }
    } )
    let techInfo = Projects.findOne();
    Projects.update({ _id: techInfo._id }, 
      { $set: { "techInfo.equipInfo.1.quantity": 1000000 } }
    );
    console.log(Projects.findOne().techInfo);
});

这应该可以,$set之前的{需要关闭

Projects.update(
    {_id: projectId},
    {$set: {"techInfo.equipInfo.1.quantity": 1000000}}
);

如果您只想更新数组的第一个对象而不取决于条件,这就是您的解决方案

Projects.update({_id: projectId},{$set : {"techInfo.equipInfo.0.quantity" : 1000000}})

如果你想遍历元素找到数组并更新它,你可以使用这个

Projects.update({_id: projectId,"techInfo.equipInfo" : {"$elemMatch" : {"type" : "module"}}},{$set : {"techInfo.equipInfo.$.quantity" : 1000000}})