我有一个NodeJS应用程序,当前使用单个mongo数据库,但是我发现自己需要获取辅助数据库中的数据。 两个数据库都在同一群集上。项目结构如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><%= title %>></title>
<link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.47.0/mapbox-gl.js'></script>
<link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.47.0/mapbox-gl.css' rel='stylesheet' />
<link rel="stylesheet" href="stylesheets/post-show.css">
</head>
<body>
<% include ../partials/navbar %>
<% include ../partials/flash-message %>
<%-body -%>
</body>
</html>
在app.js中,我一直使用 app.js
models
--Book.js
--School.js
--Class.js
--User.js
routes
--adoptions.js
views
--handlebars files
,但我知道这基本上是将猫鼬连接与全局连接“映射”,所以我要使用的是mongoose.connect()
。
我发现的所有问题和答案在同一文件中都有模型和连接对象,但是在我的项目中它们在不同的文件中。
另一个问题是,在不同的数据库上模型并不相同:Database1仅具有一个用户集合,Database2具有Book,School和Class。
即使在routes文件中定义了连接对象,我仍在努力从第二个数据库中检索数据。我试着放:
mongoose.createConnection()
在我的options.js文件中,但是当我对其中任何一个执行var conn = mongoose.createConnection('connectionStringToDatabase2', {useNewUrlParser: true});
const Class = conn.model('class');
const Book = conn.model('book');
const School = conn.model('school');
查询时,即使知道它们包含数据,我也会得到一个空数组。
我的模型文件如下:
find()
和其他模式遵循相同的结构。
如何在保持项目结构的同时使用辅助连接?我真的不想拥有一个包含所有内容的大文件,而且我知道我在这里丢失了一些东西
答案 0 :(得分:0)
因此,经过大量实验,我设法回答了自己的问题:
我在配置文件夹中创建一个新的database.js
文件,如下所示:
database.js
const mongoose = require('mongoose');
let conn = mongoose.createConnection('connectionStringToSecondaryDb', {useNewUrlParser: true});
module.exports = conn;
然后,在文档中所说的每个仅在第二个数据库中定义的模型中需要该文件,所以:
Book.js
const mongoose = require('mongoose')
const conn = require('../config/database');
const Schema = mongoose.Schema;
//Create Schema
const BookSchema = new Schema({
//Various schema stuff
}, { _id: false });
//Note here we are using the secondary conn object to model this schema
conn.model('book', BookSchema, 'book');
完成此操作后,您现在只需要在routes文件中建立辅助连接,即可像正常使用模型:
SectionRoute.js
const express = require('express');
const router = express.Router();
const mongoose = require('../config/database');
require('../models/Book');
const Book = mongoose.model('book');
//Do normal mongoose use in your route file (Book.find(), Book.save, ecc ecc)
注意:在路由部分中,我仍在使用mongoose.model
,因为我已将该文件的mongoose常量设置为database.js
传递的连接,因此它没有使用全局mongoose.connection对象!
希望这对其他人也有帮助!