我有一个名为Shop
的模型,其架构如下所示:
'use strict';
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var ShopSchema = new Schema({
name: { type: String, required: true },
address: { type: String, required: true },
description: String,
stock: { type: Number, default: 100 },
latitude: { type: Number, required: true },
longitude: { type: Number, required: true },
image: String,
link: String,
tags: [{ type: Schema.ObjectId, ref: 'Tag' }],
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now }
});
module.exports = mongoose.model('Shop', ShopSchema);
我想使用数组tags
显然通过ObjectId
引用另一个模型。当我通过db.shops.update({...}, {$set: {tags: ...}})
将id添加到属性中并且正确设置了id时,此设置正常工作。但是当我尝试通过分配给模型的Express.js控制器来完成它时,没有任何更新,甚至没有错误消息。这是控制器中的更新功能:
// Updates an existing shop in the DB.
exports.update = function(req, res) {
if(req.body._id) { delete req.body._id; }
Shop.findById(req.params.id, function (err, shop) {
if (err) { return handleError(res, err); }
if(!shop) { return res.send(404); }
var updated = _.merge(shop, req.body);
shop.updatedAt = new Date();
updated.save(function (err) {
if (err) { return handleError(res, err); }
return res.json(200, shop);
});
});
};
这适用于Shop
模型的任何其他属性,但不适用于标记。我还尝试将标签的类型设置为字符串,但这没有帮助。
我想我错过了一些关于在Mongoose中保存数组的内容吗?
答案 0 :(得分:0)
看起来问题是_.merge()
无法正确处理合并数组,在您的情况下是tags
数组。如果可以覆盖现有标记,则解决方法是在合并后添加tags
数组的显式赋值。
var updated = _.merge(shop, req.body);
if (req.body.tags) {
updated.tags = req.body.tags;
}
希望这会有所帮助..如果解决方法不充分,您可以访问lodash
论坛。