在mongoose js中查看数组元素

时间:2013-08-14 23:43:09

标签: javascript mongoose

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

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

我编译成如下所示的模型:

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

我的问题是当我访问线程对象中的message元素时:

console.log(thread_instance.messages);

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

我认为这与我如何推动阵列有关:

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

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

2 个答案:

答案 0 :(得分:2)

我认为这里的问题是你的数组包含一个对象,其中一个键是“type”。 mongoose使用type来告诉它模式中的东西是什么类型的:

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}

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

我通过将您的架构更改为以下内容来修复此问题:

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

答案 1 :(得分:0)

messages实际上是一个对象数组,所以你可以像这样指定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]);
    }  

})