Node.js 如何使用Mongoose在MongoDB模式中填充子项
我有两个文档“用户文档”和“用户令牌文档”。这应该像一对多的关系 user.model.jsNode.js 如何使用Mongoose在MongoDB模式中填充子项,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我有两个文档“用户文档”和“用户令牌文档”。这应该像一对多的关系 user.model.js var UserSchema = new Schema({ username: { type: String, unique: true, required: true }, email: { type: String, unique: true, required: tru
var UserSchema = new Schema({
username: {
type: String,
unique: true,
required: true
},
email: {
type: String,
unique: true,
required: true
},
password: {
type: String,
required: true
},
active: {
type: Boolean,
default: false,
},
tokens: [{
type: Schema.ObjectId,
ref: 'UserToken'
}],
});
module.exports = mongoose.model('User', UserSchema);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserTokenSchema = new Schema({
type: {
type: String
},
token: {
type: String
},
expiry: {
type: Date,
default: null
},
user: [{
type: Schema.ObjectId,
ref: 'User'
}]
});
module.exports = mongoose.model('UserToken', UserTokenSchema);
usertoken.model.js
var UserSchema = new Schema({
username: {
type: String,
unique: true,
required: true
},
email: {
type: String,
unique: true,
required: true
},
password: {
type: String,
required: true
},
active: {
type: Boolean,
default: false,
},
tokens: [{
type: Schema.ObjectId,
ref: 'UserToken'
}],
});
module.exports = mongoose.model('User', UserSchema);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserTokenSchema = new Schema({
type: {
type: String
},
token: {
type: String
},
expiry: {
type: Date,
default: null
},
user: [{
type: Schema.ObjectId,
ref: 'User'
}]
});
module.exports = mongoose.model('UserToken', UserTokenSchema);
用户控制器
var user = new User({
username: input.username,
email: input.email,
password: input.password,
active: false
});
user.save(function(err) {
var userToken = new UserToken({
type: 'new',
token: token,
expiry: null,
user: user._id
userToken.save(function(err) {
})
})
当我显示一个用户时,它应该填充/检索与该用户关联的所有令牌。目前还没有这样做
查询
User.find({})
.populate('tokens')
.exec(function(err, users) {
if(err) return res.json({success: 'false', errors: err});
return res.json(users);
});
UserToken.find({})
.populate('user')
.exec(function(err, tokens) {
if(err) return res.json({success: 'false', errors: err});
return res.json(tokens);
});
数据
[
{
username: "TestUser",
email: "TestEmail@hotmail.com",
password: "$2a$10$I4wJ.e3eVK7EMcfdf46x0e5kYnSTzHPTcBmzXIctduM./pZEiGbPG",
_id: "56ab4bbfa8f3e11813803566",
__v: 0,
tokens: [ ],
active: false
}
]
[
{
type: "new",
token: "16c72da8-78a7-4ee1-9b03-f5e490d7e010",
_id: "56ab4bbfa8f3e11813803567",
__v: 0,
user: [
{
username: "TestUser",
email: "TestEmail@hotmail.com",
password: "$2a$10$I4wJ.e3eVK7EMcfdf46x0e5kYnSTzHPTcBmzXIctduM./pZEiGbPG",
_id: "56ab4bbfa8f3e11813803566",
__v: 0,
tokens: [ ],
active: false
}
],
expiry: null
}
]
但是,当我显示令牌时,它正在检索关联的用户
查询
User.find({})
.populate('tokens')
.exec(function(err, users) {
if(err) return res.json({success: 'false', errors: err});
return res.json(users);
});
UserToken.find({})
.populate('user')
.exec(function(err, tokens) {
if(err) return res.json({success: 'false', errors: err});
return res.json(tokens);
});
数据
[
{
username: "TestUser",
email: "TestEmail@hotmail.com",
password: "$2a$10$I4wJ.e3eVK7EMcfdf46x0e5kYnSTzHPTcBmzXIctduM./pZEiGbPG",
_id: "56ab4bbfa8f3e11813803566",
__v: 0,
tokens: [ ],
active: false
}
]
[
{
type: "new",
token: "16c72da8-78a7-4ee1-9b03-f5e490d7e010",
_id: "56ab4bbfa8f3e11813803567",
__v: 0,
user: [
{
username: "TestUser",
email: "TestEmail@hotmail.com",
password: "$2a$10$I4wJ.e3eVK7EMcfdf46x0e5kYnSTzHPTcBmzXIctduM./pZEiGbPG",
_id: "56ab4bbfa8f3e11813803566",
__v: 0,
tokens: [ ],
active: false
}
],
expiry: null
}
]
如何检索具有所有关联令牌的用户
这应该像一对多的关系
感觉在您的解决方案中,您正在建模一种N到N的关系:
var UserSchema = new Schema({
tokens: [{
type: Schema.ObjectId,
ref: 'UserToken'
}]
...
var UserTokenSchema = new Schema({
user: [{
type: Schema.ObjectId,
ref: 'User'
}]
...
此外,如何在数据库中插入数据?请记住,没有框架可以理解这种关系,例如,您必须手动执行(每次创建新文档时更新引用)
var u1 = { ... }
Users.create(u1, function(err, user) {
UserTokens.findAndUpdate(userTokenId, {user: user._id}, function(err, uToken){
// now userToken has the reference to your new user (u1)
})
})
这应该像一对多的关系
感觉在您的解决方案中,您正在建模一种N到N的关系:
var UserSchema = new Schema({
tokens: [{
type: Schema.ObjectId,
ref: 'UserToken'
}]
...
var UserTokenSchema = new Schema({
user: [{
type: Schema.ObjectId,
ref: 'User'
}]
...
此外,如何在数据库中插入数据?请记住,没有框架可以理解这种关系,例如,您必须手动执行(每次创建新文档时更新引用)
var u1 = { ... }
Users.create(u1, function(err, user) {
UserTokens.findAndUpdate(userTokenId, {user: user._id}, function(err, uToken){
// now userToken has the reference to your new user (u1)
})
})
我更新了我原来的问题,向你展示了我是如何在我的用户控制器中创建用户和用户令牌的。你能告诉我在模式中建立1-N关系的正确方法吗?我现在明白你的意思了,我必须先创建令牌,然后在user.tokens数组中设置令牌id。但是如果在用户创建过程中出现问题,例如发送电子邮件失败,该怎么办。如果没有手动删除我创建的所有内容,它的线性i cn无法恢复到用户未创建时的状态。@KHAN我可以建议您将“userToken”制作为“user”的嵌入式文档吗?我不知道您的应用程序的逻辑,但听起来仍然是一个不错的选择:)您能通过不同的字段(例如令牌)而不是_id来查找嵌入的文档吗?根据我在文档中看到的内容,你看不到,这就是为什么我选择了单独的文档。我更新了我的原始问题,向你展示了我如何在我的用户控制器中创建用户和用户令牌。你能告诉我在模式中建立1-N关系的正确方法吗?我现在明白你的意思了,我必须先创建令牌,然后在user.tokens数组中设置令牌id。但是如果在用户创建过程中出现问题,例如发送电子邮件失败,该怎么办。如果没有手动删除我创建的所有内容,它的线性i cn无法恢复到用户未创建时的状态。@KHAN我可以建议您将“userToken”制作为“user”的嵌入式文档吗?我不知道您的应用程序的逻辑,但听起来仍然是一个不错的选择:)您能通过不同的字段(例如令牌)而不是_id来查找嵌入的文档吗?从我在文档中看到的情况来看,你无法理解这就是为什么我选择了单独的文档。