【问题标题】:Include only the path of Mongoose schema which is relevant to value of another path仅包含与另一条路径的值相关的 Mongoose 模式的路径
【发布时间】:2020-04-10 10:04:37
【问题描述】:

假设我有一个这样的架构:

Schema({
    username: String,
    privilege: {
        type: String,
        enum: ["admin", "pro", "user", "guest"],
        required: false,
        default: "user"
    },
    tagType: { // A little badge that appears next to users' names on the site.
        ///???
    }
});

对于tagType,如果privilegeadmin,我希望能够定义这样的内容:

{
    color: String,
    image: String,
    text: {
        type: String,
        required: true,
        enum: ["I'm the highest rank", "I'm an admin", "Admin privileges are great"]
    },
    dateAdded: Date
}

同时,如果privilegepro

{
    color: String,
    text: {
        type: String,
        required: false,
        enum: ["This website is great", "I'm am a Pro user", "I get a nice tag!"],
        default: "This website is great"
    },
    dateAdded: Date
}

同时,对于所有 userguest 条目,不应允许任何选项。

这种动态交叉检查可能吗?我曾尝试通读docs,但尽管其中的内容看起来要复杂得多,但我找不到任何方法来实现这一点。

【问题讨论】:

    标签: node.js mongoose schema mongoose-schema


    【解决方案1】:

    你可以使用Discriminators来实现这个

    const mongoose = require("mongoose");
    const Schema = mongoose.Schema;
    
    const userSchema = new Schema(
      {
        username: String,
        privilege: {
          type: String,
          enum: ["admin", "pro", "user", "guest"],
          required: false,
          default: "user"
        }
      },
      { discriminatorKey: "privilege" }
    );
    
    const User = mongoose.model("User", userSchema);
    
    User.discriminator(
      "admin",
      new Schema({
        tagType: {
          color: String,
          image: String,
          text: {
            type: String,
            required: true,
            enum: ["I'm the highest rank","I'm an admin","Admin privileges are great"]
          },
          dateAdded: { type: Date, default: Date.now }
        }
      })
    );
    
    User.discriminator(
      "pro",
      new Schema({
        tagType: {
          color: String,
          text: {
            type: String,
            required: false,
            enum: ["This website is great","I'm am a Pro user","I get a nice tag!"],
            default: "This website is great"
          },
          dateAdded: { type: Date, default: Date.now }
        }
      })
    );
    
    module.exports = User;
    

    使用此模型和架构,您可以创建一个带有 tagType 的用户,它将被忽略。

    创建用户的示例代码:

    const User = require("../models/user");
    
    router.post("/user", async (req, res) => {
      let result = await User.create(req.body);
      res.send(result);
    });
    

    示例请求正文:

    {
        "username": "user 1",
        "tagType": {
            "color": "red",
            "text": "I'm an admin"
        }
    }
    

    回复:

    {
        "privilege": "user",
        "_id": "5dfa07043a20814f80d60d6b",
        "username": "user 1",
        "__v": 0
    }
    

    创建管理员的示例请求:(注意我们添加了"privilege": "admin"

    {
        "username": "admin 1",
        "privilege": "admin",
        "tagType": {
            "color": "red",
            "text": "I'm an admin"
        }
    }
    

    响应:(注意tagType已保存)

    {
        "_id": "5dfa07a63a20814f80d60d6d",
        "privilege": "admin",
        "username": "admin 1",
        "tagType": {
            "color": "red",
            "text": "I'm an admin",
            "dateAdded": "2019-12-18T11:04:06.461Z"
        },
        "__v": 0
    }
    

    【讨论】:

    • 感谢您的回答和解释!
    猜你喜欢
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多