【问题标题】:Can't access object property of a Mongoose response无法访问 Mongoose 响应的对象属性
【发布时间】:2015-12-14 12:19:29
【问题描述】:

我在 node.js 上运行这段代码

var mongoose = require('mongoose');
mongoose.model('participant',new mongoose.Schema({},{ collection : 'forumParticipant' }));
var Participant = mongoose.model('participant');
mongoose.connect('******');

Participant.find({entity_id: 0}, function (err, docs) {
   console.log(docs[0]);
   console.log(docs[0].entity_id)
});

1) 第一个console.log 返回完整文档

2) 第二个console.log返回未定义

我不明白为什么。

我需要执行类似的操作

var participants = docs.map(function(d){return d.user_id})

我怎样才能做到这一点?我错过了什么?

【问题讨论】:

  • 您是否尝试过使用toObject()var participants = docs.map(function(doc) { return doc.toObject().user_id; }) 或返回普通JS 对象的lean() 方法来展平结果?
  • 问题是 mongoose 不会返回数据库中的对象,而是返回包装在适合 mongoose 的对象中的对象。

标签: node.js mongodb asynchronous mongoose


【解决方案1】:

Mongoose 在访问模型属性时做了一些时髦的事情。遇到问题时,最好的办法是使用 .lean() 作为查询的一部分,或者在输出中调用 .toObject() 将模型转换为普通的 JS 对象。

例如使用.toObject()

Participant.find({entity_id: 0}, function (err, docs) {
   console.log(docs[0].toObject());
   console.log(docs[0].toObject().entity_id)
});

例如使用lean()

Participant.find({entity_id: 0}).lean().exec(function (err, docs) {
   console.log(docs[0]);
   console.log(docs[0].entity_id)
});

【讨论】:

    【解决方案2】:

    我怀疑您尝试获取的值不在您的 Schema 中,而是存储在您的数据库中。

    您有两个解决方案。您可以将entity_id 添加到您的Schema,Mongo 将能够将其绑定到您收到的Document 对象。这是推荐的方式。

    或者您可以绕过猫鼬Schema 并使用docs[0]._doc.entity_id 访问存储在数据库中的原始文档。除非您知道自己在做什么,否则我不推荐此解决方案。

    【讨论】:

    • 正确的解决方案是将属性添加到 Schema 中,Masadow 的绕过是一种功能替代方案。
    • 感谢您的回答,它帮助了我。但是对于._id,我怎样才能访问它,它不在我的架构中,它返回未定义?
    • 是的!这!它不在架构中。所以它出现在对象的完整打印上,但在访问密钥时却没有!谢谢!
    • "怀疑您尝试获取的值不在您的架构中,而是存储在您的数据库中。"这条线节省了我的时间.. 字段不在 SCHEMA 上!
    【解决方案3】:
    Partipant.find({entity_id: 0})
    

    上面的 find() 从 DB 中返回文档数组

    您可以访问每条记录的值

    docs.map((d)=>{
        console.log(d.get('user_id'))
    })
    

    【讨论】:

    • 如果您只想访问一个文档,只需使用findOne 方法而不是find 方法。
    猜你喜欢
    • 2016-07-22
    • 2012-07-26
    • 2022-12-31
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多