在 localhost 上工作的 Mongo $lookup 在 heroku 部署中停止工作

Posted

技术标签:

【中文标题】在 localhost 上工作的 Mongo $lookup 在 heroku 部署中停止工作【英文标题】:Mongo $lookup which worked on localhost stopped working in heroku deployment 【发布时间】:2016-07-24 18:38:48 【问题描述】:

我使用 heroku 部署我的 mongoose 应用程序,而以下聚合在本地 mongo 服务器运行的 localhost 上返回正确数据,它在 heroku 服务器上返回空结果,mongolab 用于在那里处理数据库。

这是查询本身:

let projects = this.models.Project.aggregate(
[
    
        $lookup: from: 'users', localField: 'creator', foreignField: '_id', as: 'creator'
    ,

     $unwind : "$creator" ,

    
        $project: 
            name: 1,
            updated:  $dateToString:  format: "%Y-%m-%d", date: "$updated"  ,
            creator: 1,
            description: 1
        
    
]
)
.exec((err, projects) => 
console.log("fetched projects is this:", projects)
res.send(projects);
);

这是用户和项目架构:

    let userSchema = new Schema(
        _id: Schema.Types.ObjectId,
        username: String,
        password: String,
        email: String,
        gender: String,
        address: String
    );

    let projectSchema = new Schema(
        name: String,
        updated:  type: Date, default: Date.now ,
        creator: type: Schema.Types.ObjectId, ref: 'User',
        description: String,
        issues: [type: Schema.Types.ObjectId, ref: 'Issue']
    );

与 mongolab 服务器的连接已正确配置并正常工作,我能够在那里创建用户和项目实例。

我认为问题的核心是我的本地主机中的文档 id 看起来像这样:

"_id" : ObjectId("56f1ace9e72b71643070e9a0")

在 mongolab 中是这样的:

"_id": 
    "$oid": "57030f0972365f0300c56c88"

提前感谢您的帮助)

【问题讨论】:

【参考方案1】:

mLab(以前的 MongoLab)尚不支持 3.2 - $lookup 是此版本中的新功能。

http://docs.mlab.com/ops/#version-mgmt

【讨论】:

感谢您的信息,我在怀疑类似的事情【参考方案2】:

最终我想出了这个适用于当前 MongoLab 的替代方案:

resources.app.get('/projectsItems', (req, res) => 
    let projects = this.models.Project.aggregate(
        [
            
                $project: 
                    name: 1,
                    updated:  $dateToString:  format: "%Y-%m-%d", date: "$updated"  ,
                    creator: 1,
                    description: 1
                
            
        ]
    )
    .exec((err, projects) => 
        this.models.Project.populate(projects, path: "creator", (err, projects) => 
            console.log("fetched projects is this:", projects)
            res.send(projects);
        );
    );
);

有关其工作原理的更多信息,请查看here。

【讨论】:

以上是关于在 localhost 上工作的 Mongo $lookup 在 heroku 部署中停止工作的主要内容,如果未能解决你的问题,请参考以下文章

为什么%20附加到URL地址localhost

在生产中连接 mongo 和流星

在同一台服务器上运行 Mongo Node Angular

在 mongo 上苦苦挣扎的地理空间查询

本地服务器工作,在线服务器失败 - Mongo?

Auth0 - 如何通过 Auth0 在 localhost 上使用 mongoDB