【问题标题】:MongoDB private fieldsMongoDB 私有字段
【发布时间】:2015-08-13 13:58:49
【问题描述】:

我有一个产品模型,它有很多领域。其中一些专用于前端应用程序,例如:

var GameSchema = new Schema({
    likes: {
        type: [{
            type: Schema.ObjectId,
            ref: 'User'
        }]
    },
    likes_count: {
       type: Number
    }
});

我不需要数据库中的likes_count 字段,但控制器只返回模型具有的字段,所以我将likes_count 字段添加到数据库模型

exports.some_method = function(req, res){
    var game = req.game;
    game.likes_count = game.likes.length
    res.json(game);
}

有没有办法在发送请求时将额外数据添加到 db 模型而不将它们放在 db 中?

请注意,问题不在于likes_count 字段本身,我有不同的模型,但关键是在 db 模型上有额外的数据。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    对于那些仍然感兴趣的人,mongo_db mongoose(@robertklep) 有virtual 字段,可以用作数据库中不存在的临时数据字段

    GameSchema.virtual('likes_count').get(function () {
      return this.likes.length;
    });
    

    请注意,您的模型必须具有此类虚拟的权限,以便您可以在控制器中使用它

    var UserSchema = new Schema({
        username: {
            type: String
        }
    }, {
        toObject: { virtuals: true },
        toJSON: { virtuals: true }
    });
    

    【讨论】:

    • 这确实是 Mongoose 的一个特性,而不是 MongoDB 本身。
    • 对我来说,这种微不足道的操作似乎有点过头了
    • @robertklep 是的,只是打错了
    【解决方案2】:

    “有没有办法在发送请求时将额外的数据添加到 db 模型而不将它们放在 db 中?”

    从司机的角度来看,您也许可以这样做,我将把它留给那些知道这些事情的人。查看以下帖子Mapping a private backing field with MongoDB C#

    我可以从 MongoDB 引擎和服务器进程方面回答;如果您正在寻找一种方法来标记 JSON 文档中的字段,以便在发送到 MongoDB 的实际 CRUD 请求时使其私有引擎收到然后没有。

    但是,您可以在实际 CRUD 请求之前拦截 JSON 并对其进行转换。在您执行 INSERT、Modify 或 Update 语句之一之前,不会插入您正在生成的 JSON。伪步骤是生成一个 JSON 文档,将其发送到 MongoDB 前面的代理\包装器等,然后通过删除相关字段对其进行转换,然后将新对象作为 CRUD 请求发送到 MongoDB 引擎。

    【讨论】:

    • 你的意思是我必须在每次 CRUD 操作时将 apple 转换为 pineapple 并在每次来自前端的请求时转换回来?
    • 你总结了。这是一种(一种)方式,而不是一种非常有效的方式!我根本不和司机一起工作。但根据 S.O 和 Google 关于该主题的简要介绍,这可能是一个更好的领域。我认为我描述的方式效率低下。这是一个很好的问题;因此 +1。
    猜你喜欢
    • 2013-03-08
    • 2014-06-19
    • 2011-12-02
    • 2012-06-07
    • 2012-06-28
    • 2020-10-25
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多