如何在mongoose中设置objectId属性?

时间:2012-04-18 13:49:19

标签: 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
});

我想在收到新邮件时设置邮件项的发件人和收件人属性。收到消息时,我正在创建一个新的Message文档并设置其属性。但我不知道如何设置发送方和接收方属性(应该是对用户文档中的实体的引用)。我正在使用的代码如下所示。您可以根据需要判断代码,这就是我想要的。我不知道摆脱它的正确方法。但似乎这不是那个。当我使用下面的代码时,我看不到发送器和接收器属性已设置。我认为这可能是因为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...");
  }
});

如果你能说出正确的方法,那就太好了。

提前致谢。

1 个答案:

答案 0 :(得分:2)

你快到了。你是对的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...");
  });
}