【问题标题】:mongoose find result can't use as an object when I loop it当我循环时,猫鼬查找结果不能用作对象
【发布时间】:2013-12-22 00:42:41
【问题描述】:

我的集合(消息)有一个字段(程序),当我尝试使用 obj[i].PROGRAM 打印它时,它返回未定义。

var messages = db.model('messages', mongoose.Schema({}), 'messages');
messages.find({}).limit(10).exec(function(err, obj) {
    console.log(obj);
    for(var i=0; i<obj.length; i++) {
        console.log(obj[i].PROGRAM);    //why here return undefine ? 
    }
});

结果:

[ { PROGRAM: 'sudo' } ]
undefined

【问题讨论】:

  • 你的架构是什么?它需要定义一个PROGRAM 字段。
  • @WiredPrairie 喜欢这个问题:stackoverflow.com/questions/18710043/… 但我仍然不知道为什么我应该使用 obj[i]._doc.PROGRAM 什么是节点中的“_doc”?
  • 添加了解释作为答案。

标签: node.js mongodb mongoose


【解决方案1】:

您只想返回一个对象?如果是这样,以下代码应该符合您的要求:

messages.findOne({"Programm" : "sudo}, function(error, obj) {
    // ...
});


但是,如果您想查询消息集合中的所有对象,可以使用:

messages.find({}, function(error, obj) {
    // ...
    obj.forEach(function(o) {
        console.log(o.property);
    });
});

【讨论】:

  • 对不起,我的英语很差。我的问题是如何获取结果,当我尝试 console.log(obj[i].PROGRAM) 时,它返回未定义。但是,console.log(obj) 是正确的。
  • “console.log(obj[i].PROGRAM)”返回“未定义”。 "console.log(obj[i]._doc.PROGRAM)" 返回我需要的。节点中的“_doc”是什么?
【解决方案2】:

当您使用 Mongoose 时,您需要定义 Schema,然后创建模型。如果您有一个想要使用的现有集合,则需要使用 Schema 定义对该结构进行建模。例如,如果您在文档中有一个名为 PROGRAM 的字段,并且它的类型为 String

var Message = mongoose.model('messages', mongoose.Schema({
        PROGRAM : String
    }), 'messages');

您稍后可以将其引用为:

var msg = new Message();
msg.PROGRAM = 'npm';
if (msg.PROGRAM === 'node') {
   // etc... do whatever you'd want. 
} 

【讨论】:

  • 你的意思是每个现有的集合如果我想使用,我必须定义所有的字段。有没有像perl control mysql这样方便的使用方法?
  • 不要使用猫鼬。如果您只使用本机驱动程序,它不会强加或支持模式定义。 Mongoose 在驱动程序之上添加了许多抽象。
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 2012-01-09
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 2012-03-02
相关资源
最近更新 更多