gpt4 book ai didi

javascript - Mongoose : Merging two documents that reference each other

转载 作者:行者123 更新时间:2023-12-03 09:43:37 25 4
gpt4 key购买 nike

我目前正在尝试学习如何使用 NoSQL,来自关系数据库背景。在这个项目中,我将 Express 与 Mongoose 结合使用。

当我尝试将两个相互引用的模型合并在一起时,我正在努力处理回调。我正在尝试编辑一个模型(Ribbits)组中的每个项目以包含另一个模型(发布 Ribbits 的用户)的属性。由于查找与 Ribbit 关联的用户的调用是异步的,因此我无法返回已编辑的 Ribbits 集合(包含用户信息)。

在我的网站中,我有属于用户的 ribbits(又名推文)。用户可以拥有很多ribbits。在我的一个页面中,我想列出该服务上的所有 ribbit,以及与发布该 ribbit 的用户相关的一些信息。

我发现的一个解决方案是嵌入文档,但我发现,就我而言,这仅限于显示属于用户的 ribbits。就我而言,我想首先获取所有 ribbit,然后为每个 ribbit 附加有关发布者的信息。

理想情况下,我希望我的模式函数返回一个 Ribbit 对象数组,以便我可以在我的 View 中呈现它。

// models/user.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var userSchema = Schema({
username: String,
email: String,
password: String,
name: String,
profile: String,
ribbits: [{
type: Schema.Types.ObjectId,
ref: 'Ribbit',
}]
});

module.exports = mongoose.model('User', userSchema);

// models/ribbit.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
User = require('./user');

var ribbitSchema = Schema({
content: { type: String, maxlength: 140 },
created: { type: Date, default: Date.now() },
owner: { type: Schema.Types.ObjectId, ref: 'User' },
});

ribbitSchema.methods.getOwnerObj = function(cb) {
return User.findOne({ _id: this.owner }, cb);
}

ribbitSchema.statics.getAllRibbits = function(cb) {
this.find({}, function(err, ribbits) {
console.log('Before Transform');
console.log(ribbits);

ribbits.forEach(function(ribbit) {
ribbit.getOwnerObj(function(err, owner) {
ribbit = {
content: ribbit.content,
created: ribbit.created,
owner: {
username: owner.username,
email: owner.email,
name: owner.name,
profile: owner.profile,
}
};
});
});
});
}

module.exports = mongoose.model('Ribbit', ribbitSchema);

最佳答案

如果我理解正确的话,你可以使用 Mongoose populate此场景的方法:

ribbitSchema.statics.getAllRibbits = function(cb) {
this.find({}).populate('owner').exec(function(err, ribbits){
console.log(ribbits[0].owner)
return cb(err, ribbits);
})
}

关于javascript - Mongoose : Merging two documents that reference each other,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31105740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com