通过Mongoose在MongoDB中存储另一个文档中embedded的文档的副本

我们有要求将一个Mongo文档的副本作为embedded式子文档存储在另一个文档中。 它应该有一个原始文件的参考。 复制的文档需要是深层复制,如原始快照。

原始文档的模式(使用Mongoose定义)不是固定的 – 它当前使用一种inheritance来允许对模式进行不同的添加,具体取决于“types”。


  1. 在Mongoose模型中有这样一个灵活的embedded式模式吗?
  2. 是否需要在运行时注入,何时才能知道模式?

我们目前的模型/模式是这样的:

///UserList Schema: - this should contain a deep copy of a List user: { type: ObjectId, ref: 'User' }, list: { /* Not sure if this is a how we should store the reference type: ObjectId, ref: 'List' */ listId: ObjectId, name: { type: String, required: true }, items: [{ type: ObjectId, ref: 'Item' }] } 

 ///List Schema: name: { type: String, required: true }, items: [{ type: ObjectId, ref: 'Item' }], createdBy: { type: ObjectId, ref: 'User' } 

我们目前使用的代码使用inheritance来允许不同的项目types。 我意识到这种技术可能不是实现我们所需的灵活性的最佳方式,而不是我的问题的焦点。

 ///Item Model + Schema var mongoose = require('mongoose'), nodeutils = require('util'), Schema = mongoose.Schema, ObjectId = Schema.Types.ObjectId; function ItemSchema() { var self = this; Schema.apply(this, arguments); self.add({ question: { type: String, required: true } }); self.methods.toDiscriminator = function(type) { var Item = mongoose.model('Item'); this.__proto__ = new Item.discriminators[type](this); return this; }; } nodeutils.inherits(ItemSchema, Schema); module.exports = ItemSchema; 

我想你只需要在你的父母mongoose模式中为文档创build一个空{}对象。 这样你就可以存储任何对象的全部数据。

 parentobj : { name: Sring, nestedObj: {} } 

我认为在这一点上,你需要的是在保存之前将你的嵌套对象标记为已修改。 这里是我的mongoose代码的一个例子。

 exports.update = function(req, res) { User.findById(req.params.id, function (err, eluser) { if (err) { return handleError(res, err); } if(!eluser) { return res.send(404); } var updated = _.merge(eluser, req.body); //This makes NESTEDDATA OBJECT to be saved updated.markModified('nestedData'); updated.save(function (err) { if (err) { return handleError(res, err); } return res.json(200, eluser); }); }); }; 

另外,如果在nestedDocument中需要一个不同的文档数组,正确的方法是这样的:

 parentobj : { name: Sring, nestedObjs: [Schema.Types.Mixed] } 

请仔细检查Mongoose Schema Types

编辑

正如你所说,我会添加你最终的解决scheme,包括在nestedObj数组定义澄清的对象types确定的一个..

 var ItemSchema = new Schema({ item1: String, item2: String }); var parentobj = new Schema({ name: Sring, nestedObj: [ItemSchema] }); 

编辑2:记住添加新的项目nestedArray,必须完成nestedArray.push(item)

问候!!