【问题标题】:Seed MongoDB Data - Only Once?种子 MongoDB 数据 - 只有一次?
【发布时间】:2019-06-18 03:36:58
【问题描述】:

我对播种的概念有点陌生。

我的目标是在数据库中有一组可以在前端显示的数据。我不想每次启动服务器时都“播种”数据库。我只想添加一组数据。我已经想出了如何为数据库播种,但前提是每次启动服务器时都要播种。我这样做对吗?我如何只播种一次?谢谢!服务器启动时,我在 app.js 中运行 seedfoods() 函数。

var mongoose = require("mongoose");
var Food = require("./models/food");

function seedfoods() { 
//add the foods to the database
data.forEach(function(seedfoods){
Food.create(seedfoods, function(err, Food){
if(err){
console.log(err)
} else {
console.log("added a food");
}
});
});

}

var data = [
{ 
name: "Avocados",
easyFood: true,
phase1: true,
about: "Yum Avocados",
},

{ 
name: "Milk",
easyFood: true,
phase1: true,
about: "Yum Milk",
},
]

module.exports = seedfoods;

【问题讨论】:

  • 选项 1: 使用单独的应用程序将数据放入数据库。 选项 2: 检查条件我们是否已经在数据库中有数据
  • 我试过 name: { type: String, required: false, unique: true },它可以工作,但显然每次都会抛出重复的错误。这似乎很糟糕。
  • 您可以查看收藏的“计数”。如果为0,则为种子,否则完全跳过。
  • 喜欢这个? Food.count([], function (err, count) { console.log(count); });
  • 是的,然后将计数保存在 var 中。之后,如果那个 var === 0,种子。

标签: node.js database mongodb express mongoose


【解决方案1】:

几个选项:

在服务器启动时有一个初始脚本,该脚本运行一次种子并存储某种这样做的记录(例如,数据库条目或文件或类似的东西)。这可能是最干净的,但也是最努力的。

我建议您这样做:您可以通过简单地在更新查询中使用 upsert 选项来跳过对现有文档的检测,如果它不存在,则只会创建一个新文档。因此,只需在每次开始时使用选项{upsert: true} 进行更新操作即可运行您的种子。

https://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate

【讨论】:

    猜你喜欢
    • 2019-06-19
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2017-09-27
    相关资源
    最近更新 更多