Mongoose 模式,带有带有必填字段的嵌套可选对象

问题描述 投票:0回答:5

我想创建一个 Mongoose 模式来验证下面的对象,并具有以下限制:

  • field2是可选的(0-1关系),
  • 如果 field2 存在,则需要 field2.type (请注意,字段名称是“type”,作为类型定义的 mongoose 保留字),
  • field2 和基础对象必须位于同一文档中。

代码示例

{
  field1: "data",
  field2: {
    type: "data",
    data: "data"
  }
}

提前致谢。

node.js mongodb mongoose
5个回答
22
投票

你可以参考这个答案

{
  field1: "your data",
  field2: {
    type: {
      "your data"
    },
    required: false
  }
}

所以一个例子是:

{
  field1: String,
  field2: {
    type: {
      nestedField1: { type: String, required: true },
      nestedField2: String
    },
    required:false
  }
}

如果

field2
存在,则需要
nestedField1


13
投票

@Mina Michael 答案对我不起作用,但是,当我稍微调整一下它对我有用。我试过这样:

{
  field1: String,
  field2:{
    type: new Schema({
      nestedField1: {type:Boolean,required:true},
      nestedField2: String,
    }),
    required: false
  }
}

0
投票

你的意思可能是这样的:

var Field2Schema = new mongoose.Schema({
  type: { type: String, required: true },
  data: String
});

var MainSchema = new mongoose.Schema({
  field1: String,
  field2: Field2Schema
});

0
投票

如何将具有此模式的数据插入数据库..主要是那些嵌套字段...employee.namefirst = req.body.namefirst;

//first = req.body.namefirst;
employee.name.middle = req.body.namemiddle;
employee.name.last = req.body.namelast; 

0
投票

MongoDB 安装链接另一个 MongoDB 安装链接.

下面是 Ubuntu 22.04 的安装命令副本,未经测试。

sudo apt-get install gnupg curl
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org

启动 MongoD 的命令:

sudo mongod --config /etc/mongod.conf
// sudo mongod --config /etc/mongod.conf

let mongoose = require("mongoose");

let schema1 = new mongoose.Schema({
    valueA: String,
    valueB: Buffer,
    valueC: Boolean,
    valueD: Date,
    valueE: Number,
    valueF: mongoose.Schema.Types.Mixed,
    valueG: mongoose.Schema.Types.ObjectId,
    valueH: { type: mongoose.Schema.Types.Array, default: undefined },
    valueI: {
        valueJ: String,
        valueK: Number
    },
    valueL: { type: String, required: false, default: "defaultstring1" },
    valueM: { type: Number, required: true, default: 0 },
    valueN: { type: Date, default: Date.now() }
});

let model1 = mongoose.model('schema1', schema1);

mongoose.connect('mongodb://127.0.0.1:27017/2024February28Connection11111111111111');

// https://www.geeksforgeeks.org/mongoose-document-api/

// Code below might not run in sequence. Printing to console should work, wishing. However, the code running order shouldn't go in sequence. For example, code printing might not go in sequence, and multiple runs in terminal might output non-equal results, or different results.

(async () => await model1.insertMany(
    [
        {valueM: 0},
        {valueM: 1},
        {valueM: 2},
        {valueM: 3},
        {valueM: 4},
        {valueM: 5},
        {},
        {},
        {},
        {},
        {}
    ]))().then(value => {
        
        console.log(value);
        
        (async () => await model1.find())().then(value => {
            
            console.log(value);

            (async () => await model1.insertMany(
                [
                    {
                        valueA: "string0",
                        valueC: true,
                        valueE: 1,
                        valueH: [0,1,2,3,4,5],
                        valueI: { valueJ: "string1", valueK: 1111 }
                    },
                    {
                        valueA: "string1111",
                        valueC: false,
                        valueE: 11111,
                        valueH: ["arrayvalue0", "arrayvalue1", "arrayvalue2", "arrayvalue3", "arrayvalue4", "arrayvalue5"],
                        valueI: { valueJ: "string1111111", valueK: 1111111 }
                    }
                ]))().then(value => {
                    
                    console.log(value);

                (async () => await model1.find())().then(value => {
                    
                    console.log(value)
                    
                    let model1variable1 = new model1(
                        {
                            valueA: "model1variable1valueA0",
                            valueC: false,
                            valueE: 0,
                            valueH: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                            valueI: { valueJ: "model1variable1ValueJ0", valueK: 1 }
                        }
                    );

                    (async () => await model1variable1.save())().then(value => {
                        
                        console.log(value);
                        
                        (async () => await model1.find())().then(value => {
                            
                            console.log(value);
                            
                            (async () => await new model1({}).save())().then(value => {
                                
                                console.log(value);
                                
                                (async () => await model1.find())().then(value => {
                                    
                                    console.log(value);
                                    
                                    (async () => await model1.find({valueM: 5}))().then(value => {
                                        
                                        console.log(value);
                                        
                                        (async () => await model1.find({valueA: "string0"}))().then(value => {
                                            
                                            console.log(value);
                                            
                                            mongoose.connection.close().then(function() {
                                                console.log('Mongoose default(?) connection closed');
                                            });
                                            
                                        }, value => console.log(value));
                                        
                                    }, value => console.log(value));
                                    
                                }, value => console.log(value));
                                
                            }, value => console.log(value));
                            
                        }, value => console.log(value));
                        
                    }, value => console.log(value));
                    
                }, value => console.log(value));
                
            }, value => console.log(value));
            
        }, value => console.log(value));
        
    }, value => console.log(value));

...顺便说一句,如果想要存储上述数据类型中未包含的数据,或者 MongoDB 或 Mongoose 等提供的数据类型,一个想法可能是将其转换为字符串并将其存储为字符串。

例如,可能会将图像转换为字符串并将其存储为字符串。

在很多情况下,字符串和数字可能会实现很多目标。字符串可以与文本和其他数据类型一起转换为字符串并转换回来,数字可以与数学和数学工作一起使用,类似于加法、减法、乘法、除法、求幂和取模等等......。 :)

© www.soinside.com 2019 - 2024. All rights reserved.