node.js - 如何在 mongoose 中设置 objectId 属性?

标签 node.js mongodb mongoose

我有一个名为 Message 的架构,如下所示;

Message = new Schema({
    id: Number,
    sender: ObjectId,
    receiver: ObjectId,
    date: Date,
    content: String,
    type: Number
});

以及如下所示的用户架构;

User = new Schema({
 id: Number,
 username: String,
 isOnline: Boolean
});

我想在收到新消息时设置消息项的发送者和接收者属性。收到消息后,我将创建一个新的消息文档并设置其属性。但我不知道如何设置发送者和接收者属性(应该是对用户文档中实体的引用)。我正在使用的代码如下所示。你可以随意判断代码,这就是我想要的。我不知道摆脱它的正确方法。但似乎不是这个。当我使用下面的代码时,我看不到发送者和接收者属性的设置。我认为这可能是因为 findOne 是异步的(我不知道是否是异步的)。

var m = new Message();
m.content = messageData.text;
m.id = messageId;
User.findOne({id: socket.userId}, function (e, o) {
  m.sender = o;
});

User.findOne({id: messageData.userId}, function (e, o) {
  m.receiver = o;
});

m.save(function (e) {
  if (!e) {
    console.log("message is saved to the mongodb...");
  }
});

如果您能告诉我们正确的方法,那就太好了。

提前致谢。

最佳答案

你就快到了。 findOne 是异步的,您是正确的。您只需要处理它们的回调并在它们响应后保存消息。以下是您可以使用的典型模式:

var m = new Message();
m.content = messageData.text;
m.id = messageId;
User.findOne({id: socket.userId}, function (e, o) {
  if (e) return handleError(e); // assuming you want to handle errors somehow
  m.sender = o;
  m.sender && m.receiver && save();
});

User.findOne({id: messageData.userId}, function (e, o) {
  if (e) return handleError(e); // assuming you want to handle errors somehow
  m.receiver = o;
  m.sender && m.receiver && save();
});

function save () {
  m.save(function (e) {
    if (e) return handleError(e);
    console.log("message is saved to the mongodb...");
  });
}

关于node.js - 如何在 mongoose 中设置 objectId 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10210802/

相关文章:

javascript - 通过JavaScript发送数组到nodejs

javascript - 在 Mongodb/Mongoose 聚合的子集中应用 $cond

MongoDB/Mongoose 对单个文档的原子读写

node.js - 方法 "collection.find()"最多接受两个参数

node.js - npm install karma 脚本启动器错误

javascript - NodeJS 和 Socket.IO

mongodb - 没有从连接参数中获取正确的mongo数据库,而是必须手动对其进行映射

mongodb - 使用 MongoDB 时存储大量文档的生产最佳实践是什么?

grails - 即使使用显式刷新,也无法让 GORM mongodb 插件保存新记录

javascript - Nodejs for 循环并等待循环完成