流星在mongodb中返回数组的长度

时间:2015-05-07 10:07:50

标签: arrays mongodb meteor

在我的用户个人资料集合中,我有一个包含图像对象的数组。

用户的个人资料集合中最多可以包含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
        }
    });
},

2 个答案:

答案 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
            }
        });
    }
},