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();