更新Mongoose模型对象的数组项

时间:2016-02-09 03:26:00

标签: node.js mongodb mongoose

我无法弄清楚这一点。这是我正在使用的模型:

var Groceries = new Schema({
     name : {type : String, required : true}
     items : {type : Array, required : true}
});

items只是Array的{​​{1}}。示例对象如下所示:

Strings

现在,我将收到一条有三件事的POST请求:

  1. 购物清单的name : "Shopping List" items : ["Bananas", "Apples", "Oranges"]
  2. 我要替换的项目name
  3. 将取代现有版本的新index
  4. 示例有效负载是:

    item

    我希望能够按名称查找相应的列表,然后将{ "name" : "Shopping List", "replacementIndex" : "2", "newItem" : "Cereal" } 上的值替换为replacementIndex中的值。

    我该怎么做?

1 个答案:

答案 0 :(得分:0)

从有效负载动态创建更新查询。在mongo shell中,以下演示展示了如何采用这种方法:

// populate a test collection
db.test.insert({name : "Shopping List", items : ["Bananas", "Apples", "Oranges"]})

// dynamically create the query
var payload = {
    "name" : "Shopping List",
    "replacementIndex" : "2",
    "newItem" : "Cereal"
};
var query = {},
    update = {"$set": {}};
query["name"] = payload.name;
query["items."+payload.replacementIndex] = { "$exists": true }; // query = {"name": "Shopping List", "items.2": { "$exists": true }}
update["$set"]["items."+payload.replacementIndex] = payload.newItem; // update = {"$set": { "items.2": "Cereal" }}

// update collection
db.test.update(query, update);

在上面,您要查询集合中包含name属性值“Shopping List”且其items数组具有的元素的集合 索引2.如果找到文档,则使用 $set 运算符将数组元素替换为指定值。

Mongoose的实施过程非常简单:

var query = {},
    update = {"$set": {}};
query["name"] = payload.name;
query["items."+payload.replacementIndex] = { "$exists": true }; // query = {"name": "Shopping List", "items.2": { "$exists": true }}
update["$set"]["items."+payload.replacementIndex] = payload.newItem; // update = {"$set": { "items.2": "Cereal" }}

Model.update(query, update, function(err, result){
    if (err) { /* Handle err */ }
    console.log(result);
})