在mongoDB中添加嵌套子文档的最佳方法

达克斯

我有一个用户和一个消息模型。关系如下:一个用户可以有很多消息。

目标:我正在寻找添加新消息并将其链接到相应用户的最佳或最优雅的方法。

用户模型:

const UserSchema = new Schema({
  username: {
    type: String,
    required: true,
    unique: true
  },
  email: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
  },
  register_date: {
    type: Date,
    default: Date.now
  },
  osrs_messages: [OsrsMessage]
});

消息模型:

const OsrsMessageSchema = new Schema({
  message: {
    type: String,
    required: true,
  },
  username: {
    type: String,
    required: true,
    unique: true,
  },
  send_date: {
    type: Date,
    default: Date.now
  }
});

我的路由器添加新消息并将消息添加到相关用户:

router.post("/osrs", verifyAccessToken, async (req, res) => {
  try {
    const { username, message } = req.body;
    // create a new message and save
    let newMessage = new OsrsMessage({ username, message });
    newMessage = await newMessage.save();
    // get the associated user and add new message to messages array
    let user = await User.findById(req.user.id);
    user.osrs_messages.push({ username, message });
    user = await user.save();
    return res.status(200).json({ message: "message received" });
  } catch (error) {
    console.log("error message:", error);
    return res
      .status(500)
      .json({ message: "Oops... looks like something went wrong" });
  }
});

有什么办法可以改善这个状况?我应该使用findOneAndUpdate还是insert代替?如果我将消息链接到用户,是否可以将消息自动添加到我的消息集中?还是必须始终手动将其添加到消息集中?

gypsyCoder

您需要手动将消息添加到集合中。但是您可以通过使用Populate

填充是自动用其他集合中的文档替换文档中指定路径的过程

您可以在这里有一个很好的概述Populate

使用集合的主要优点是,在集合中保留了_id文档的引用,如果需要更新任何嵌套的文档,OsrsMessage则无需将其更新/重新插入User

populate的文档很好地概述了如何使用它。我希望这将帮助您改善当前的实施。

你可以这样写

const UserSchema = new Schema({
username: {
type: String,
required: true,
unique: true
},
email: {
type: String,
required: true,
unique: true,
},
password: {
type: String,
required: true,
},
register_date: {
type: Date,
default: Date.now
},
osrs_messages: [{ type: Schema.Types.ObjectId, ref: 'OsrsMessage' }]
});

在您的代码中以以下方式添加消息

router.post("/osrs", verifyAccessToken, async (req, res) => {
try {
const { username, message } = req.body;
// create a new message and save
let newMessage = new OsrsMessage({ username, message });
newMessage = await newMessage.save();
// get the associated user and add new message to messages array
let user = await User.findById(req.user.id);
user.osrs_messages.push(newMessage._id);
user = await user.save();
return res.status(200).json({ message: "message received" });
} catch (error) {
console.log("error message:", error);
return res
  .status(500)
  .json({ message: "Oops... looks like something went wrong" });
}
});

之后,每当需要向用户发送消息时,都可以像这样进行查询

const user = await User.
    findById(req.user.id).
    populate({ path: 'osrs_messages'}).
    exec();

在这里,您将获得所有用户osrs_messages的列表

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

(MongoDB)向文档中添加一个新字段,其值为其嵌套子文档数组的总和

使用 arrayFilters 更新 MongoDB 中的嵌套子文档

MongoDB聚合嵌套子文档字段

嵌套子文档中存在检查键

更新猫鼬中的嵌套子文档

如何使用C#在MongoDB中的嵌套子数组文档中查找元素

对查询结果基于Mongoose / Mongodb数组中嵌套子文档的desc值进行排序

MongoDB 聚合查询 - 返回嵌套子文档中的所有项目

在Mongoose中对嵌套子文档进行排序和分组

根据ElasticSearch中的嵌套子计数对文档进行排序

MongoDB-Mongoose,在嵌套查询中添加新文档数据

Mongodb $ pull执行以从嵌套子数组中删除ObjectId(“ ... id”)。

如何在mongodb中动态在现有嵌套文档中添加文档

在C#/ MongoDB中更新嵌套数组的最佳方法

如何在嵌套子文档mongodb中使用数组查找字段?

mongodb中的嵌套文档聚合

在MongoDB中查询嵌套文档

C ++中的嵌套子类

Oracle中的嵌套子查询

ContextMenuStrip 中的嵌套子菜单

在Firestore中删除包含所有子集合和嵌套子集合的文档

如何使用Spring在mongodb文档的嵌套数组中添加json?

MongoDB在使用动态键在嵌套文档中添加两个值时遇到问题

查询MongoDB文档中的嵌套字典

如何在mongodb中查询嵌套文档?

在MongoDB中更新嵌套数组文档

MongoDB查询Java中的嵌套文档

更新MongoDB集合文档中的嵌套键值

在mongoDb中查询嵌套的文档结构