Mongo基于索引更新数组中的字段

时间:2016-11-10 00:14:48

标签: mongodb meteor mongodb-query angular-meteor

我有一组项目(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 btw

4 个答案:

答案 0 :(得分:2)

我认为你需要这个:

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

答案 1 :(得分:2)

“这不起作用”是什么意思?有错误吗?

以下按预期工作,作为新的流星项目中的/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);
});

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

这应该有效,{需要关闭$set

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