mongoose populate引用返回undefined

时间:2016-12-15 12:43:18

标签: node.js mongodb express mongoose

我对猫鼬来说相当新,所以我可能在这里错过了一些东西。

我有两个收藏品“公司”& “用户”我试图让所有属于公司的用户,但公司的用户数组返回undefined而不是我期望的用户对象。

我已阅读文档并且填充似乎是朝着正确方向迈出的一步但是,它没有提到任何阶段(我可以看到)如何保存到数组中我假设我需要推送对象到用户对象上的emails属性?

我来自一个非常沉重的mysql背景,如果有人能解释MongoDB如何处理关系,我可能会错误地做些事情。

公司架构

const companySchema = new Schema({
    name: String,
    slug: String,
    _creator: { type: Schema.Types.ObjectId, ref: 'User' },
    users: [{ type: Schema.Types.ObjectId, ref: 'User' }],
    created_at: Date,
    updated_at: Date
});

module.exports = mongoose.model('Company', companySchema);

用户架构

const userSchema = new Schema({
    first_name: String,
    last_name: String,
    username: String,
    password: String,
    companies: [{ type: Schema.Types.ObjectId, ref: 'Company' }],
    created_at: Date,
    updated_at: Date
});

module.exports = mongoose.model('User', userSchema);

保存用户

const dave = new User({
    first_name: 'Dave',
    last_name: 'Hewitt',
    username: 'moshie',
    password: '123456789',
    updated_at: new Date()
});

dave.save()
    .then(function (user) {
        const indigoTree = new Company({
            name: 'IndigoTree',
            slug: 'indigotree',
            _creator: dave._id,
            updated_at: new Date()
        });

        indigoTree.users.push(user);

        return indigoTree.save();
    })
    .then(function (company) {
        console.log(company);
    })
    .catch(function (error) {
        console.log(error);
    });

检查用户

Company.find({}).populate('users').exec()
   .then(function (doc) {
       doc.users // undefined?
   });

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

根据API Docs,Mongoose的find()返回数组而不是单个项。

  

对于findOne(),它是一个潜在的null单文档,find()文档列表,count()文档数,update()受影响的文档数等等

Company.find({}).populate('users').exec().then((doc) => {
    console.log(doc[0].users); // prints users array
});

答案 1 :(得分:0)

您正在将user推入users阵列。相反,您需要push user's Id进入数组,即user._id

<强>替换

indigoTree.users.push(user);

。通过

indigoTree.users.push(user._id);

此外,find()查询返回array of documents,因此您需要使用doc[0].users,而不是doc.users

Company.find({}).populate('users').exec()
   .then(function (doc) {
       doc[0].users // undefined? -> change here, it wont come undefined
   });

另外,您可以使用findOne()代替find(),而object会返回doc.users。在这种情况下,您可以使用 Company.findOne({_id: someCompanyId}).populate('users').exec() .then(function (doc) { doc.users // it wont come undefined });

try {
    pm = (KodoPersistenceManager)
        ((KodoPersistenceManagerFactory) kpmf).getPersistenceManager(false,
        KodoPersistenceManager.CONN_RETAIN_PM);
    Connection c = ((Connection)pm.getConnection());
    c.setTransactionIsolation(
        ISQLServerConnection.TRANSACTION_READ_UNCOMMITTED);

    // ... use pm with retained connection ...

} finally { // reset retained connection, e.g. if pooled
    if (pm != null) {
        Connection c = ((Connection)pm.getConnection());
        c.setTransactionIsolation(
            ISQLServerConnection.TRANSACTION_READ_UNCOMMITTED);
    }
}