gpt4 book ai didi

node.js - Node JS - Mongoose - 如何通过 ID 正确连接两个集合的结果

转载 作者:行者123 更新时间:2023-12-03 12:17:45 26 4
gpt4 key购买 nike

我有以下用于跟踪习惯和用户进度的模式

习惯图式

const HabitSchema = new mongoose.Schema({
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
},
title: {
type: String,
required: true,
},
type: {
type: String,
enum: ["Goal", "Limit"],
default: "Goal",
required: true,
},
dateStarted: {
type: Date,
default: Date.now,
required: true,
},
});

进度模式:每次用户点击他们在给定时间段(天、周、月等)完成一个习惯时,都会为该时间段创建一个文档,以表明它已经完成。

const ProgressSchema = new mongoose.Schema({
habit: {
type: mongoose.Schema.Types.ObjectId,
ref: "Habit",
},
period: {
type: Date,
default: Date.now,
required: true,
},
value: {
type: Number,
default: 1,
required: true,
},
});

当我获得用户的所有习惯时,我还想获得每个习惯的所有进度文档。我想在返回之前加入这些对象。

这是我尝试过的:

let habits = await Habit.find({ user: req.user.id }).sort({
dateStarted: -1,
});

habits = await Promise.all(
habits.map(async (h, i) => {
try {
const progress = await Progress.find({ habit: h._id });

return { ...h, progress };
} catch (e) {
res.status(500).send("Server Error");
}
})
);
res.json({ habits });

这给出了错误:CastError: Cast to ObjectId failed for value "undefined"at path "_id"for model "Habit"

完成此任务的正确方法是什么?

最佳答案

考虑到我使用了 await/async,我仍然不明白为什么会出现错误,所以在检索到 id 之前该行不应该运行(错误是说 ._id 是未定义的,而它显然不是) .

在尝试了很多东西之后,这里是最终起作用的:

try {
await Promise.all(
habits.map(async (h, i) => {
let progress = await Progress.find({ habit: h._id });
let newHabit = h;
newHabit._doc.progresses = progress;
return newHabit;
})
);
} catch (error) {
console.log(error);
res.status(500).send("Server Error");
}

一旦我终于让 await Progress.find({ habit: h._id }); 开始工作,我还发现我不能只添加一个 mongoose 检索对象传播运营商。该对象有很多属性,数据库中的字段实际上包含在对象的 ._doc 属性中:newHabit._doc.progresses = progress(但这与我的错误无关得到)。这让我觉得有一种更好的方法可以将字段添加到 mongoose .find() 找到的文档中。

关于node.js - Node JS - Mongoose - 如何通过 ID 正确连接两个集合的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65101301/

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