gpt4 book ai didi

node.js - Mongoose - REST API - 查询不同模型的模式

转载 作者:搜寻专家 更新时间:2023-10-31 23:31:40 26 4
gpt4 key购买 nike

我试图避免数据库回调查询。

假设您有两个如下所示的模式:

1st) User Schema

 username : {type: String, unique: true},
age : {type: Number}

2nd) Activity Schema

 owner: [{type: Schema.Types.ObjectId, ref: 'User'}],
city: {type: String},
date: {type: Date}

到目前为止一切顺利。

现在假设你有一个到 /user/:id 的路由,你期望得到 usernameage ,但是如果我还想在该路线上返回最新事件怎么办?

编辑:请注意 latest activity 不是数据库中的值。它像 activity.find({owner: ObjectId(id)}).sort({date: -1}).limit(1)

一样自动计算

现在做了什么:

User.findOne({username:req.params.username}).lean().exec(function(err,userDoc)
{

if(err) return errHandler(err);

Activity.findOne({owner:userDoc.username}).sort({date:-1}).exec(function(err,EventDoc){

if(err) return errHandler(err);

userDoc.latest_activity = EventDoc._id;

res.json(userDoc);
res.end();

})

})

上面代码片段的问题在于难以维护,如果我们想向该 API 功能添加更多内容怎么办?除非我们实现 Q,否则我们将以大量查询的回调结束。

We tried to look at Virtual but the issue with that is that you can't really query inside a mongoose Virtual, since it returns a race-condition, and you are most likely not get that document on time.

我们也尝试查看 populate,但由于 populate 的文档非常糟糕,我们未能成功。

问题:有没有办法让它更加模块化?

有没有办法避免 hell 般的数据库查询回调?

例如,这种事情可能吗?

    User.findOne({username:req.params.username}).lean().populate(
{path:'Event',sort:{Date:-1}, limit(1)}
).exec(function(req,res))...

谢谢!

最佳答案

受@BrianShambien 的回答启发,您可以使用帖子保存,但不是仅将 _id 存储在用户身上,而是仅存储最后一个事件的子文档。然后,当您捕获该用户时,它会在那里显示最后一个事件。

用户模型

username :     {type: String, unique: true},
age : {type: Number},
last_activity: ActivitySchema

然后你在你的ActivitySchema上做一个post save hook

ActivitySchema.post('save', function(doc) {
UserSchema.findOne({username: doc.owner}).exec(function(err, user){
if (err) errHandler(err);

user.last_activity = doc;

user.save(function(err) {
if (err) errHandler(err);
});
});
});

************更新************

如果用户不是所有者而是事件的参与者,这将包括对用户的更新。

ActivitySchema.post('save', function(doc) {
findAndUpdateUser(doc.owner, doc);

if (doc.participants) {
for (var i in doc.participants) {
findAndUpdateUser(doc.participants[i], doc);
}
}
});

var findAndUpdateUser = function (username, doc) {
UserSchema.findOne({username: username}).exec(function (err, user) {
if (err) errHandler(err);

user.last_activity = doc;

user.save(function (err) {
if (err) errHandler(err);
});
});
});

关于node.js - Mongoose - REST API - 查询不同模型的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27475093/

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