Node、Express、MongoDB:使用对象数组创建模式?

Node, Express, MongoDB: Creating a schema with an array of objects?

这是我想要的架构:

{
    username: "taimoor",
    pairs: [
        {
            code: "CA",
            site: "google.ca"
        },
        {
            code: "US",
            site: "google.com"
        },
        {
            code: "GB",
            site: "google.co.uk"
        }
    ]
    date: 1574880349,
}

这是我当前的架构:

const redirectionSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true,
    },
    pairs: [
        // What do I place here?
    ],
    date: {
        type: Date,
        required: true,
        default: Date.now
    }
})

我不知道如何使用 mongoose 继续和实施它。我应该创建另一个名为 Pair 的模式吗?如果是这样:

感谢您抽空,这是我第一次使用 NoSQL。

型号

const redirectionSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true,
    },
    pairs: [
        {
            _id: false,
            code: { type: String },
            site: { type: String }
        }
    ],
    date: {
        type: Date,
        required: true,
        default: Date.now
    }
})

const Redirection = mongoose.model('Redirection', redirectionSchema);

使用

const redirection = new Redirection({
    username: "taimoor",
    pairs: [
        {
            code: "CA",
            site: "google.ca"
        },
        {
            code: "US",
            site: "google.com"
        },
        {
            code: "GB",
            site: "google.co.uk"
        }
    ],
    date: new Date(1574880349),
})

redirection.save();

示例数据库输出

{
  "_id": {
    "$oid": "5ddecc4c6dd3760c40ff354b"
  },
  "username": "taimoor",
  "pairs": [
    {
      "code": "CA",
      "site": "google.ca"
    },
    {
      "code": "US",
      "site": "google.com"
    },
    {
      "code": "GB",
      "site": "google.co.uk"
    }
  ],
  "date": {
    "$date": "1970-01-19T05:28:00.349Z"
  },
  "__v": 0
}

您需要有一个配对的内部架构。这样您就可以对这些对应用必需的或其他验证。

const mongoose = require("mongoose");

const redirectionSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true
  },
  pairs: [
    new mongoose.Schema({
      code: {
        type: String,
        required: true
      },
      site: {
        type: String,
        required: true
      }
    })
  ],
  date: {
    type: Date,
    required: true,
    default: Date.now
  }
});

module.exports = mongoose.model("Redirect", redirectionSchema);

并且您可以使用以下 App.js 创建包含用户名和对的文档,或将另一对添加到现有文档。

App.js

const express = require("express");
const app = express();
const mongoose = require("mongoose");
const Redirect = require("./models/redirect");
const url = "mongodb://localhost:27017/redirectDB";

const port = process.env.PORT || 3000;

app.use(express.json());

mongoose
  .connect(url, {
    useNewUrlParser: true,
    useUnifiedTopology: true
  })
  .then(() => {
    app.listen(port, () => {
      console.log(`App running on port ${port}...`);
    });
  })
  .catch(error => console.log(error));

app.post("/redirect", async (req, res) => {
  try {
    const result = await Redirect.create(req.body);
    res.send(result);
  } catch (err) {
    console.log(err);
    res.status(500).send("Something went wrong");
  }
});

app.post("/redirect/:id/pair", async (req, res) => {
  const { code, site } = req.body;

  try {
    const result = await Redirect.findByIdAndUpdate(
      req.params.id,
      {
        $push: {
          pairs: { code, site }
        }
      },
      { new: true }
    );

    res.send(result);
  } catch (err) {
    console.log(err);
    res.status(500).send("Something went wrong");
  }
});

要创建用户名和配对,请像这样向 url http://localhost:3000/redirect 发送 post 请求:

{
    "username": "taimoor",
    "pairs": [
        {
            "code": "CA",
            "site": "google.ca"
        },
        {
            "code": "US",
            "site": "google.com"
        }
    ]
}

响应将是这样的:

{
    "_id": "5ddecfcb3cd5c035b4c31d95",
    "username": "taimoor",
    "pairs": [
        {
            "_id": "5ddecfcb3cd5c035b4c31d97",
            "code": "CA",
            "site": "google.ca"
        },
        {
            "_id": "5ddecfcb3cd5c035b4c31d96",
            "code": "US",
            "site": "google.com"
        }
    ],
    "date": "2019-11-27T19:34:35.781Z",
    "__v": 0
}

稍后我们可以使用对此 url http://localhost:3000/redirect/5ddecfcb3cd5c035b4c31d95/pair 的 post 请求向该文档添加新对。 url中的id是我们之前创建的id,在response中得到的。

要求:

{
    "code": "GB",
    "site": "google.co.uk"
}

响应:

{
    "_id": "5ddecfcb3cd5c035b4c31d95",
    "username": "taimoor",
    "pairs": [
        {
            "_id": "5ddecfcb3cd5c035b4c31d97",
            "code": "CA",
            "site": "google.ca"
        },
        {
            "_id": "5ddecfcb3cd5c035b4c31d96",
            "code": "US",
            "site": "google.com"
        },
        {
            "_id": "5dded01693be502168a0f794",
            "code": "GB",
            "site": "google.co.uk"
        }
    ],
    "date": "2019-11-27T19:34:35.781Z",
    "__v": 0
}