1

所以我有一个线程的这个模式(它几乎是一个聊天室:)

var threadSchema = mongoose.Schema({
    messages: [{
        message:String,
        type:String
    }],
    point_id:String
});

我编译成一个模型,如图所示:

var Thread = mongoose.model('Thread',threadSchema);

我的问题是,当我像这样访问线程对象中的消息元素时:

console.log(thread_instance.messages);

它打印出'[object Object]'。即使我在浏览器中解析它也会这样做;它实际上是返回那个字符串'[object Object]'。

我相信这与我推动阵列的方式有关:

this_thread.messages.push({message:data.message,type:data.type});

我的写作/阅读方式有什么问题?非常感谢您的宝贵时间。

4

2 回答 2

2

我认为这里的问题是您的数组包含一个对象,其中一个键是“类型”。 typemongoose 使用它来告诉它架构中的事物是什么类型,如下所示:

var ExhibitSchema = new Schema({
    title  : { type: String, trim: true }
    , description : { type: String, trim: true }
    , discussion  :   {type: Schema.Types.ObjectId, ref: "Discussion"} 
    , views: {type: Number, default: 0}

所以在你的情况下,你告诉猫鼬你有一个messages字符串类型的数组。它可能只是忽略了这一message:String部分。当您将内容添加到该数组中时,它会调用toString()它来存储它。这就是您["[object Object]", "[object Object]"在 db 中看到 的原因。

Id 通过将架构更改为如下所示来修复它:

var threadSchema = mongoose.Schema({
    messages: [{
        message:{ type: String},
        type:{ type: String}
    }],
    point_id:String
});
于 2013-08-17T14:06:53.703 回答
0

messages实际上是一个对象数组,因此您可以像这样指定消息数组的索引

console.log(thread_instance.messages[0]);

如果messages数组包含多个元素,则需要常规 for 循环

for (var i = 0; i<thread_instance.messages.length; i++) {
  // use i as an array index
  console.log(thread_instance.messages[i]);
}  

因此,将所有代码组合在一起,代码将如下所示

Thread.find(function (err, thread_instance) {

    for (var i = 0; i<thread_instance.messages.length; i++) {
      // use i as an array index
      console.log(thread_instance.messages[i]);
    }  

})
于 2013-08-17T13:37:26.653 回答