Mongoose 3.8中的ObjectIds数组

时间:2015-03-02 03:08:55

标签: javascript node.js mongodb mongoose mongodb-query

我有一个名为Message的模式,它有一个属性replies,它们也是Message对象。我试图用mongoose定义它,但是replies一直未定义返回。

var MessageSchema = new Schema({
    sender: {
        type: Schema.ObjectId,
        ref: 'User'
    },
    replies: [{type:Schema.ObjectId, ref:'Message'}],
    roomId: String,
    sendTime: Date,
    content: String,
    parentId: Schema.ObjectId
});

我还尝试了replies: [MessageSchema]replies:[Schema.ObjectId],但所有这些都继续未定义。

1 个答案:

答案 0 :(得分:1)

您列出的代码没有任何问题,因此您没有向我们展示导致问题的代码。

当您引用时,您将同时保存集合中的对象副本,并将相关的ObjectId值添加到" reply"中的对象数组中。在你的情况下。

有几种方法可以做到,但一个安全的MongoDB方法是使用$push添加其他项目。

作为一个完整的例子:

var async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;


var userSchema = new Schema({
  "name": String
});

var messageSchema = new Schema({
  "sender": { "type": Schema.Types.ObjectId, "ref": "User" },
  "replies": [{ "type": Schema.Types.ObjectId, "ref": "Message" }],
  "roomId": String,
  "sendTime": { "type": Date, "default": Date.now },
  "content": String,
  "parentId": Schema.Types.ObjectId
});

var Message = mongoose.model( "Message", messageSchema );
var User = mongoose.model( "User", userSchema );

mongoose.connect('mongodb://localhost/test');

async.waterfall(
  [
    // Clean up samples
    function(callback) {
      async.each(
        [User,Message],
        function(model,callback) {
          model.remove({},callback);
        },
        callback
      )
    },

    // Create user
    function(callback) {
      User.create({ "name": "Bill" },callback);
    },

    // Create a message
    function(user,callback) {
      Message.create({
        "sender": user._id,
        "roomId": "1",
        "content": "message"
      },function(err,message) {
        callback(err,user,message);
      });
    },

    // Create a reply
    function(user,message,callback) {
      Message.create({
        "sender": user._id,
        "roomId": "1",
        "content": "reply",
        "parentId": message._id
      },callback);
    },

    // Save that reply on the parent
    function(message,callback) {
      Message.findByIdAndUpdate(
        message.parentId,
        { "$push": { "replies": message._id } },
        function(err,message) {
          console.info( message );
          callback(err);
        }
      );
    },

    // List that
    function(callback) {
      Message.find({},function(err,messages) {
        if (err) callback(err);

        console.log(
          "All:\n%s",
          JSON.stringify( messages, undefined, 4 )
        );
        callback();
      });
    }

  ],
  function(err) {
    if (err) throw err;
    mongoose.disconnect();
  }
);

输出:

{ _id: 54f3dff198a8c85306a2ef67,
  sender: 54f3dff198a8c85306a2ef66,
  roomId: '1',
  content: 'message',
  __v: 0,
  sendTime: Mon Mar 02 2015 14:58:41 GMT+1100 (AEDT),
  replies: [ 54f3dff198a8c85306a2ef68 ] }
All:
[
    {
        "_id": "54f3dff198a8c85306a2ef67",
        "sender": "54f3dff198a8c85306a2ef66",
        "roomId": "1",
        "content": "message",
        "__v": 0,
        "sendTime": "2015-03-02T03:58:41.387Z",
        "replies": [
            "54f3dff198a8c85306a2ef68"
        ]
    },
    {
        "_id": "54f3dff198a8c85306a2ef68",
        "sender": "54f3dff198a8c85306a2ef66",
        "roomId": "1",
        "content": "reply",
        "parentId": "54f3dff198a8c85306a2ef67",
        "__v": 0,
        "sendTime": "2015-03-02T03:58:41.393Z",
        "replies": []
    }
]

如果你在一条消息上打电话给.populate(),那么这就是"回复"现在,它将返回到集合并检索相关数据,并使其看起来数据也是该项目的一部分。

请注意,不会发生这样的魔法,并且递归地#34;没有你自己的干预。它只是一个基本的帮手,所以如果你想要更多,那么你仍然需要自己完成提升。

相关问题