MongoDB查询:从子数组中排除对象?

时间:2013-05-25 11:21:06

标签: javascript node.js mongodb

我正在为我的NodeJS应用程序开发一个简单的登录系统。为此我创建了一个结构,其中一个对象“公司”拥有一组用户。我已经完成了,因为我打算使用公司对象来存储应用程序会话数据。

{
    "name": "My Corporation",
    "prefix": "MYCORP",
    "users": [
        {
            "username": "some@user.com",
            "password": "974dae09cd5869958c19e1742117c2f8",
            "name": "Freddly the User"
        },
        {
            "username": "other@user.com",
            "password": "974dae09cd5869958c19e1742117c2f8",
            "name": "Max the Admin"
        }
    ]
}

问题是当用户(在登录场景中)查询后,查询(如预期的那样)返回整个公司对象。因此我暴露了所有用户,即使我只想要一个。就安全性而言,我认为这不是什么大问题,但我更担心性能。下面是当前查询和删除所有用户的非常丑陋的方法,但请求的是。

忽略不同的断言。代码非常重要。::)

db.collection('kat_corp', function (err, collection) {
    try {
        assert.equal(null, err);

        collection.findOne({
            users: {
                $elemMatch: {
                    username: user.username
                }
            }
        }, function (err, result) {
            if (err) callback(err, false);

            // Delete all other users from the to-be session object
            for (var i = 0; i < result.users.length; i++) {
                if (result.users[i].username != user.username) {
                    delete result.users[i];
                }
            }
            // Will be replaced with success callback
            console.log(result);
        });

    } catch (err) {
        callback(err, false);
    }
});

1 个答案:

答案 0 :(得分:2)

如果您使用的是MongoDB 2.2或更高版本,则可以使用"$" positional operator

以下查询对我有用:

db.collection('kat_corp', function (err, collection){
    collection.findOne({"users.username":user.username}, {'name':1,'users.$': 1}, console.log) 
});

虽然我同意其他评论,你应该重新考虑你的架构......