我正在尝试加入两个集合并能够获取组合数据。要使用Mongoose这样做,我应该使用填充语法来实现它。我收到的错误是Schema Schema尚未注册'User_Fb'。从我的代码,我已经导出了我的server.js中的模型和必需,但错误仍然出现。我做错了什么?
feed_post.model.js
var mongoose = require('mongoose');
var conn_new_app = mongoose.createConnection('mongodb://localhost/new_app');
var User_fb = require('../models/fb_db.model');
var Schema = mongoose.Schema;
var feed_postSchema = new Schema({
user_id: { type: Schema.Types.ObjectId, ref: 'User_Fb' },
content: String,
location: String,
image: [{ type : String }]
});
var Feed_Post = conn_new_app.model('Feed_Post', feed_postSchema);
module.exports = Feed_Post;
fb_db.model.js
var mongoose = require('mongoose');
var conn_new_app = mongoose.createConnection('mongodb://localhost/new_app');
var Feed_Post = require('../models/feed_post.model');
var user_fb = new mongoose.Schema({
name: String,
location: String,
fb_id: Number
});
var User_Fb = conn_new_app.model('User_Fb', user_fb);
module.exports = User_Fb;
server.js
var express = require('express'),
mongoose = require('mongoose'),
User = require('./app/models/user.model'),
Post = require('./app/models/post.model'),
Maptest = require('./app/models/maptest.model'),
Feed_Post = require('./app/models/feed_post.model'),
User_Fb = require('./app/models/fb_db.model'),
app = express();
app.get('/testget', function(req,res){
Feed_Post.findOne().populate('user_id').exec(function(err, c) {
if (err) { return console.log(err); }
console.log(c.fk_user.userName);
});
});
更新了Pier-Luc Gendreau答案
fb_db.model.js
module.exports = function (connection) {
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var user_fb = new mongoose.Schema({
name: String,
location: String,
fb_id: Number
});
return connection.model('User_FB', user_fb);;
}
feed_post.model.js
module.exports = function (connection) {
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var feed_postSchema = new Schema({
user_id: { type: Schema.Types.ObjectId, ref: 'User_Fb' },
content: String,
location: String,
image: [{ type : String }]
});
return connection.model('Feed_Post', feed_postSchema);;
}
server.js
var express = require('express'),
app = express(),
mongoose = require('mongoose'),
conn_new_app = mongoose.createConnection('mongodb://localhost/new_app'),
User_Fb = require('./app/models/fb_db.model')(conn_new_app),
Feed_Post = require('./app/models/feed_post.model')(conn_new_app);
app.get('/testget', function(req,res){
Feed_Post.find().populate('user_id').exec(function(err, res) {
if (err) { return console.log(err); }
console.log(res);
});
});
答案 0 :(得分:5)
问题是您在每个模型中创建一个新连接,因此最终会得到一堆不同的连接对象。即使它们指向同一个数据库,但是mongoose模型也不知道其他连接。您应该在主应用程序中创建连接对象,然后传递它。
<强> server.js 强>
var express = require('express');
var mongoose = require('mongoose');
var app = express();
var conn_new_app = mongoose.createConnection('mongodb://localhost/new_app');
var Feed_Post = require('./app/models/feed_post.model')(conn_new_app);
app.get('/testget', function(req,res){
Feed_Post.findOne().populate('user_id').exec(function(err, c) {
if (err) { return console.log(err); }
console.log(c.fk_user.userName);
});
});
然后修改你的模型,使它们实际上是一个函数:
<强> feed_post.model.js 强>
module.exports = function (connection) {
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var feed_postSchema = new Schema({
user_id: { type: Schema.Types.ObjectId, ref: 'User_Fb' },
content: String,
location: String,
image: [{ type : String }]
});
return connection.model('Feed_Post', feed_postSchema);;
}
此外,像Adrian提到的那样,你可以使用猫鼬作为单身人士。但是,我建议您使用createConnection
,因为如果您需要第二个连接,则不必将连接代码重构为第一个数据库。
答案 1 :(得分:3)
看起来您正在为每个模型创建不同的数据库连接,从而将模型彼此隔离。 Mongoose必须假设这种隔离,因为它们可能存在于不同的数据库甚至数据库服务器上。
尝试连接一次,在定义模型时只需调用mongoose.model()
而不是connection.model()
。默认情况下,Mongoose是一个单身人士。
答案 2 :(得分:3)
这就是我必须做的Customer.findOne({}).populate({ path: 'created_by', model: User })
而不是这个~Category.findOne({})。populate({&#39; author&#39;})〜
答案 3 :(得分:2)
如果您(真的)使用多个mongoDB连接
我确实认识到这不是OP的情况,但如果你真的使用多个连接,你必须在使用.populate()时提供模型,因为mongoose只会&#34;找到&#34;同一连接上的模型。 即在哪里:
var db1 = mongoose.createConnection('mongodb://localhost:27017/gh3639');
var db2 = mongoose.createConnection('mongodb://localhost:27017/gh3639_2');
var userSchema = mongoose.Schema({
"name": String,
"email": String
});
var customerSchema = mongoose.Schema({
"name" : { type: String },
"email" : [ String ],
"created_by" : { type: mongoose.Schema.Types.ObjectId, ref: 'users' },
});
var User = db1.model('users', userSchema);
var Customer = db2.model('customers', customerSchema);
<强>正确:强>
Customer.findOne({}).populate('created_by', 'name email', User)
或
Customer.findOne({}).populate({ path: 'created_by', model: User })
不正确(生成&#34;架构尚未注册模型&#34;错误):
Customer.findOne({}).populate('created_by');
答案 4 :(得分:0)
就我而言,此问题是因为我没有将ref model
包含在应用程序中。
答案 5 :(得分:0)
您可以使用 select
获取客户电子邮件的示例:
Customer.findOne({}).populate({ path: 'created_by', model: User, select: 'email' })