在Schema中保存ObjectId数组

时间:2014-12-05 17:47:05

标签: node.js mongodb mongoose

我有一个名为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中保存数组的内容吗?

1 个答案:

答案 0 :(得分:0)

看起来问题是_.merge()无法正确处理合并数组,在您的情况下是tags数组。如果可以覆盖现有标记,则解决方法是在合并后添加tags数组的显式赋值。

var updated = _.merge(shop, req.body);
if (req.body.tags) {
  updated.tags = req.body.tags;
} 

希望这会有所帮助..如果解决方法不充分,您可以访问lodash论坛。