2017-09-02 62 views
0

我在mongo数据库中有一个用户集合,它有一个公司字段,它是对另一个名为Company的集合的引用。 我将该公司分配给用户。当我尝试打印公司领域内的数据时,它返回我:未定义。NodeJs/Mongoose - 无法从对象ID中找到数据

这是我使用的代码,

console.log('company: ' + req.user.company); 
if(req.user.company) 
    console.log("LOGGED IN USER" + "\n Email:" + req.user.username + "\n Psw: " + req.user.password + "\n Role: " + req.user.role + "\n Company: " + req.user.company.name); 

,这是在终端上的应答:

company: 59aab09745db5532c4321742 
LOGGED IN USER 
Email:[email protected] 
Psw: $2a$10$Z7h3ikaDJLhLXMotV.odaerGf5RFRXxDmlVxCFdvTaL48WalNIwRy 
Role: admin 
Company: undefined 

,你可以看到第一端子线示出了分配给该公司ID特定的用户,但是当我尝试打印该公司的名称时,它返回未定义。

这是该公司的集合项,它的名称是场为我打印上面

image

我在哪里错了对象ID是一样的吗? 如果您需要更多信息,请让我知道 谢谢

+0

*“我在哪里错了?”*我们怎么知道?这里没有执行查询的代码。这实际上是您需要向我们展示的唯一代码,它甚至不在此处。\ –

+0

@NeilLunn如果您注意,他正在打印'req.user.company',它显示为ObjectId,而不是对象本身。他没有填充该领域。我认为这很明显,即使代码不明确。 – lilezek

+0

你的评论说:'在这里,因为如果这是一个缺少“填充”的问题,那么字段参考值将在那里,而不是未定义。它在那里,看看他的代码'公司:59aab09745db5532c4321742'。你是盲人还是只是倾斜? – lilezek

回答

1

您必须填写公司。

http://mongoosejs.com/docs/populate.html

当您打印:

console.log('company: ' + req.user.company); 

它显示:

company: 59aab09745db5532c4321742 

所以你req.user.company是不是你期望得到的对象,但在该_id的字符串目的。所以它必须填充。

当你使用类似User.findOne({...})你必须追加人口是这样的:

User.findOne({...}).populate("company"); 

对象引用存储为包含引用文件的的ObjectId字符串。如果你想引用不是字符串,而是它所引用的对象,你必须这样做。

+0

只要注意他的代码。他印刷公司,是一个字符串,而不是一个对象。这是不填充该字段的明显问题。我不认为我的假设有什么问题。未定义不是'req.user.company'的值,而是'req.user.company.whatever'的值,因为'req.user.company'是一个字符串。 – lilezek

+0

@NeilLunn因为你不明白我的观点,而你没有看到你错了,所以你做了一个倒行逆施。热闹。 – lilezek

+0

我给你一个downvote,因为'undefined'只是参考输入值没有被定义的结果。与填充没有任何关系,也没有试图在问题中显示“查询”。无知和坏态度真的只是奖励的原因 –