Meteor MongoDB: $pull/$pullAll error



因此,我试图编写一个事件处理程序和方法,添加帖子的用户名,并将其添加到Meteor用户的profile文档下的数组following中。如果它已经存在,它将从用户的following数组中删除该名称,取消对用户的关注。

事件处理程序调用userFollow方法,该方法检查是否已在跟踪以及所有这些。这些东西都有用。不起作用的是实际的MongoDB函数。下面的查询中有东西抛出Exception while invoking method 'userFollow' MongoError: Cannot apply $pull/$pullAll modifier to non-array。我知道一个事实,在users集合下,user>profile>following是一个用户名数组。

为什么我的查询出现此错误?

userFollow: function(postAttributes) {
    var user = Meteor.user();
    var targetUser = postAttributes.username;
/* Check if the user is logged in, then check
*  if the user is tying to follow themself. */
if (!user) {
    throw new Meteor.Error(401, "You need to login to follow.");
}
    if (user.username == targetUser) {
        throw new Meteor.Error(401, "You can can't follow yourself.");
    }
    /* Checks if the target user is already in the
    *  current user's following array. */
    function userFollowed(targetUser, user) {
        for (var i in user.profile.following) {
            if (user.profile.following[i] == targetUser) {
                return true;
            }
        }
        return false;
    }
    /* Uses userFollowed to either follow or unfollow
    *  the user in question. */
    if (userFollowed(targetUser, user) == true ) {
        console.log("Unfollowing");
        Meteor.users.update(
            { _id: user._id },
            { $pull: { profile: { following: targetUser } } },
            { multi: true }
        );
    } else if (userFollowed(targetUser, user) == false ) {
        console.log("Following");
        Meteor.users.update(
            { _id: user._id },
            { $push: { profile: { following: targetUser } } }
        );
    } else {
        throw new Meteor.Error(401, "The userFollowed check failed.");
    }
}

我认为语法应该是:

{$push: {'profile.following': targetUser}}

但是,您可能需要使用$addToSet:

{$addToSet: {'profile.following': targetUser}}

这将确保您在following数组中只有唯一的值。我知道您正在用userFollowed检查这一点,但无论如何,这都是一个很好的模式。

还请注意,您可以将userFollowed替换为以下内容:

var userFollowed = _.contains(user.profile.following, targetUser);

最新更新