Mongoose:如何replace一个子文档数组?

我已经build立了一个包含子文档“contacts”的mongoose用户模式。 子文档“contacts”是包含实际联系人(引用另一个用户对象)和一些与“友谊”有关的数据的联系人对象的集合。

在我的前端应用程序中,我现在可以通过添加或删除用户到我的联系人列表来pipe理联系人。 前端将这些更改保存为HTTP PUT请求到服务器。

PUT请求包含整个用户对象,或多或less地replace数据库上的用户对象。 不幸的是,它不可能取代子文档集合。 你只能推新的或删除它们。

这里是模式:

var UserSchema = new Mongoose.Schema({ username: { type: String, index: { unique: true, sparse: true }, required: true, lowercase: true, trim: true }, email: { type: String, index: { unique: true, sparse: true }, required: true, lowercase: true, trim: true }, contacts: [ContactSchema] }); var ContactSchema = new Mongoose.Schema({ user: { ref: "User", type: Mongoose.Schema.ObjectId }, isContact: { type: Boolean, default: true } }); 

目前我尝试通过删除所有联系人并添加请求中的联系人来replace联系人:

 app.put('/me', loadUser, function(req, res, next) { var user = req.user; req.user.contacts.forEach(function(contact) { req.body.contacts.forEach(function(contact) { contact.remove(); }); }); req.body.contacts.forEach(function(contact) { req.user.contacts.push(contact); }); user.save(function(err, user) { if (err) return next(err); res.send(200); }); }); 

有人真的有一个更好的主意,我可以如何更新这个子文档集合的请求状态?

您可以使用_underscore库来筛选(拒绝)要删除的对象

这里有一个例子,如何从一个数组中删除某些东西。

 var _und = require('underscore'); var array = [{_id:1, title:'object one'}, {_id:2, title:'object two'}, {_id:3, title: 'object three' }] the_target = 'object two'; new_array = _und.reject(array, function(item){ return item.title === target; }) 

预期的结果应该是:

 => [{_id:1, title:'object one'}, {_id:3, title:'object three'}] 

如果你知道这个ID,那就更好了。

所有你需要做的是通过这样做清空你的subdocs:

 var mytargetarray = []; mytargetarray.push(new_array); mytargetarray.save(); 

如果你想replace整个subdoc数组,为什么不只是replace它们:

 req.user.contacts = []; req.user.contacts.push(req.body.contacts); 

保存并完成。

希望有点帮助。

只是一个提示,在MongoDB中你使用对象数组,你可以简单地replace每个值:

 // active data from database user.name = 'test user'; // now just give the object a new value user.name = 'new name'; // and save .. done user.save();