我有以下结构。我想防止推送具有相同属性的文档。
例如,基本上,我首先找到用户对象。如果我有另一个vid(已经在里面),它将不会被推入。尝试使用$ addToSet,但是失败了。
我在用猫鼬。
这是我的模型结构:
var User = mongoose.model('User', {
oauthID: Number,
name: String,
username: String,
email: String,
location: String,
birthday: String,
joindate: Date,
pvideos: Array
});
这是我推入Mongo的代码
exports.pinkvideo = function(req, res) {
var vid = req.body.vid;
var oauthid = req.body.oauthid;
var User = require('../models/user.js');
var user = User.findOne({
oauthID: oauthid
}, function(err, obj) {
if (!err && obj != null) {
obj.pvideos.push({
vid: vid
});
obj.save(function(err) {
res.json({
status: 'success'
});
});
}
});
};
您想要的是.update()
方法,而不是.save()
在进行更改后检索文档并使用。
这不仅使您能够访问$addToSet
所提到的运算符,而且其目的是避免在数组中重复数据,因为将更改仅发送到数据库而不是整个文档来回发送,所以效率更高得多:
User.update(
{ oauthID: oauthid },
{ "$addToSet": { "pVideos": vid } },
function( err, numAffected ) {
// check error
res.json({ status: "success" })
}
)
唯一可能的问题是它确实取决于您实际向阵列中推送的内容并期望它是唯一的。因此,如果您的数组已经看起来像这样:
[ { "name": "A", "value": 1 } ]
然后您发送并更新了一个像这样的数组元素:
{ "name": "A", "value": 2 }
这样,该文档将不会被认为仅存在于“名称”中“ A”的值上,而是会添加其他文档,而不仅仅是替换现有文档。
因此,您需要小心自己的意图,如果这是您要寻找的逻辑,那么您将需要查找文档并针对所需条件测试现有的阵列条目。
但是对于您根本不想添加清晰重复项的基本方案,则$addToSet
如图所示,这就是您想要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句