javascript - MongoDB查询: Exclude objects from child array?

标签 javascript node.js mongodb

我正在为我的 NodeJS 应用程序开发一个简单的登录系统。为此,我创建了一个结构,其中一个对象(“公司”)包含一组用户。我这样做是因为我计划使用公司对象来存储应用程序 session 数据。

{
    "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);
    }
});

最佳答案

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

以下查询对我有用:

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

尽管我同意其他评论,但您可能应该重新考虑您的架构...

关于javascript - MongoDB查询: Exclude objects from child array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16749012/

相关文章:

javascript - Typescript 中的条件默认导出

mongodb - 如何在 MongoVUE 中使用聚合框架?

javascript - 按 $project 字段聚合和 $lookup

c# - 从 global.asax.cs 调用 JavaScript 函数

javascript - IE 11 中的 &lt;input type ="file"> 属性未正确显示

node.js - 多个 socket.io 客户端连接 - 强制新连接

MongoDB 网络子网查找

javascript - 检查 JavaScript 中的虚假值

javascript - 如何更改属于 jquery.flexslider-min.js 文件的 jquery flexslider 的高度?

javascript - 无法使用 firebase 从 node.js 部署中引用公用文件夹