所以我有一个线程的这个架构(它几乎是一个聊天室:)
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});
我的写作/阅读方式有什么问题?非常感谢你的时间。
答案 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]);
}
})