在我的用户个人资料集合中,我有一个包含图像对象的数组。
用户的个人资料集合中最多可以包含3张图片。如果用户有3,则抛出已达到最大值的错误。用户可以选择在前端删除图像。
我认为解决方案是用$ size检查数组的长度。如果它小于3,则插入图像,否则抛出错误。
我正在使用tomi:upload-jquery包。
客户端:
Template.uploadImage.helpers({
uploadUserData: function() {
return Meteor.user();
},
finishUpload: function() {
return {
finished: function(index, fileInfo, context) {
Meteor.call('insert.profileImage', fileInfo, function(error, userId) {
if (error) {
// todo: display modal with error
return console.log(error.reason);
} else {
// console.log('success ' +userId);
// console.log('success ' + fileInfo);
}
});
}
};
}
});
我使用的方法(服务器):
'insert.profileImage': function(postImage) {
check(postImage, Object);
// check array profile.images max 3
Meteor.users.update(this.userId, {
$push: {
'profile.images': postImage
}
});
},
答案 0 :(得分:1)
您可以使用$where
运算符执行此功能:
'insert.profileImage': function(postImage) {
var updateResults;
check(postImage, Object);
updateResults = Meteor.users.update(
{
_id : this.userId,
$where : 'this.profile.images.length < 3' //'this' is the tested doc
},
{
$push: {
'profile.images': postImage
}
});
if(updateResults === 0) {
throw new Meteor.Error('too-many-profile-images',
'A user can only have up to 3 images on his/her profile');
}
},
Mongo文档warns about potential performance issues(如果你在商店的所有文档上运行JavaScript函数,你会遇到不好的意外)但是因为我们也在_id
搜索,我想它应该没问题
这样,如果用户的图像太多,则更新不会运行。您还可以检查受影响文档的数量(return value of the update
)以了解是否发生了某些事情。如果没有(返回0
),则可能性不大:用户图像太多。
答案 1 :(得分:0)
使用$exists
运算符检查是否存在具有 dot notation 的至少第四个配置文件图像数组元素(索引位置3)的所有文档。例如,您可以使用find()
方法检查profile.image
数组的大小是否大于3,如下所示:
var hasSizeGreaterThanThree = Meteor.users.find(
{
'_id': this.userId,
'profile.image.3': { '$exists': true }
}).count() > 0;
所以你可以在你的代码中使用它:
'insert.profileImage': function(postImage) {
check(postImage, Object);
// check array profile.images max 3
var hasSizeGreaterThanThree = Meteor.users.find(
{
'_id': this.userId,
'profile.image.3': { '$exists': true }
}).count() > 0;
if (!hasSizeGreaterThanThree){
Meteor.users.update(this.userId, {
$push: {
'profile.images': postImage
}
});
}
},