gpt4 book ai didi

mongodb - Mongoose 查询不显示子文档

转载 作者:可可西里 更新时间:2023-11-01 10:36:25 26 4
gpt4 key购买 nike

运行 find() 时我无法让 mongoose 显示子文档,而它在 mongodb shell 中显示得很好。

子文档应该根据我的模式嵌入,而不是引用 objectId,所以我不应该运行任何黑魔法巫术来显示我的数据。

const UserSchema = new mongoose.Schema({
username: String;
xp: Number;
//etc.
});

const RoomSchema = new mongoose.Schema({
timestamp: { type: Date, default: Date.now },
status: { type: String, enum: ["pending", "ongoing", "completed"]},
players: {
type: [{
points: { type: Number, default: 0 },
position: String,
user: UserSchema
}],
maxlength:2
}
});

添加新房间后:

let room = new Room(coreObj);
room.players.push({
points: 0,
position: 'blue',
user: userObj //where userObj is a result of running findById on User model
});

它在 mongo shell 中显示得很好,当运行 db.rooms.find({}).pretty() 时,我可以看到已添加完整文档。但是,在 Mongoose 模型上运行时:

Room.find({}).exec((err,rooms)=>{
console.log(rooms[0].toJSON());
});

我没有看到用户子文档,而且我完全看不到用户字段!似乎是什么问题?

从 mongoose 模型记录 json:

{
"status": "pending",
"_id": "5cf5a25c050db208641a2076",
"timestamp": "2019-06-03T22:42:36.946Z",
"players": [
{
"points": 0,
"_id": "5cf5a25c050db208641a2077",
"position": "blue"
}
],
"__v": 0
}

来自 mongo shell 的 json:

{
"_id" : ObjectId("5cf5a25c050db208641a2076"),
"status" : "pending",
"timestamp" : ISODate("2019-06-03T22:42:36.946Z"),
"players" : [
{
"points" : 0,
"_id" : ObjectId("5cf5a25c050db208641a2077"),
"position" : "blue",
"user" : {
"xp" : 0,
"_id" : ObjectId("5cf2da91a45db837b8061270"),
"username" : "bogdan_zvonko",
"__v" : 0
}
}
],
"__v" : 0
}

最佳答案

考虑到最佳实践,我认为在 RoomSchema 中引用 UserSchema 会更合适。像这样的东西:

...
user: {
type: Schema.Types.ObjectId,
ref: 'UserSchema'
}

然后您将在该字段中存储 user._id

这样,如果用户被修改,您的 RoomSchema 将始终引用正确的信息。然后,您可以使用 Mongoose 的 populate

获取用户

关于mongodb - Mongoose 查询不显示子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56435859/

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