【问题标题】:Mongoose: updating array in document not workingMongoose:更新文档中的数组不起作用
【发布时间】:2017-11-27 04:55:50
【问题描述】:

我正在尝试更新文档中的数组,如果它不存在则添加对象,否则替换数组中的对象。但是除了 $set 参数之外,没有任何东西 ($push, $addToSet) 做任何事情,并且 $set 按预期工作 - 覆盖整个数组。 我的猫鼬模式:

var cartSchema = mongoose.Schema({
   mail: String,
   items: Array
});

发布请求处理程序:

app.post('/addToCart', function(req, res) {
var request = req.body;
Cart.findOneAndUpdate({
        "mail": request.mail
    }, {
        $addToSet: {
            "items": request.item
        }
    }, {
        upsert: true
    },
    function(err, result) {
        console.log(result);
    }
);
    res.send(true);
});

我从客户端发送的数据:

{  
"mail":"test@gmail.com",
"item":{  
      "_id":"59da78db7e9e0433280578ec",
      "manufacturer":"Schecter",
      "referenceNo":"Daemon-412",
      "type":"Gitare",
      "image":"images/ba9727909d6c3c26412341907e7e12041507489988265.jpeg",
      "__v":0,
      "subcategories":[  
          "Elektricne"
      ]
}
}

编辑:

当我触发“addToCart”请求时,我也会得到这个日志:

{ MongoError: The field 'items' must be an array but is of type object in 
document {_id: ObjectId('5a19ae2884d236048c8c91e2')}

【问题讨论】:

  • item的内容是什么?
  • 原帖底部的json对象
  • 查看更新。
  • 你有“item”的模型吗?还是只是一个对象数组。

标签: javascript node.js mongodb express mongoose


【解决方案1】:

$addToSet 中的比较只有在现有文档具有完全相同的字段和值且字段顺序相同的情况下才会成功。否则算子会失败。

因此,在您的情况下, request.item 始终需要完全相同。

我建议创建一个“项目”模型。然后,您的购物车架构将如下所示:

var cartSchema = mongoose.Schema({
   mail: String,
   items: [{
        type: ObjectId,
        ref: 'item',
    }],
});

并让 MongoDB 确定该项目是否存在。

【讨论】:

    【解决方案2】:

    这应该可以工作,您只需要实现objectExits 函数来测试该项目是否是您正在寻找的那个:

    Cart.findOne({ "mail": request.mail })
        .exec()
        .then(cart => {
            var replaced = cart.items.some((item, i) => {
                if (item._id == request.item._id)) {
                    cart.items[i] = request.item;
                    return true;
                }
            })
            if (!replaced) {
                cart.items.push(request.item);
            }
            cart.save();
            return cart;
        })
        .catch(err => {
            console.log(err)
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 2021-04-08
      • 2017-03-31
      • 2017-01-19
      • 2016-10-06
      • 2014-08-28
      • 1970-01-01
      相关资源
      最近更新 更多