如何在mongoose中设置objectId属性?

我有一个名为消息像下面的模式;

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

和下面的用户架构;

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

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

 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是asynchronous的。 你只需要处理他们的callback,并在他们都回应后保存消息。 以下是您可以使用的典型模式:

 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..."); }); }