Mongoose elemMatch返回一个空数组

我目前正在构build一个Web应用程序,并且在过去的12个小时里我发现了一个我无法解决的问题。

我正在研究一种基本的get方法,在这种方法中,我试图检索某个员工正在工作的某些工作职位(即收银员,职员)(客户端完美工作)。

WorkPosition的mongoose模型是这样的(models / work-position.js):

var mongoose = require('mongoose'); var User = require('./user'); var Schema = mongoose.Schema; var schema = new Schema ({ workplace : {type: String, required: true}, type : {type: String, required: true}, status : {type: String, required: true}, color : {type: String, required: true}, employees: [{type: Schema.Types.ObjectId, ref:'User'}] }); module.exports = mongoose.model('WorkPosition', schema); 

我的get方法(routes / work-position.js):

 var express = require('express'); var router = express.Router(); var jwt = require('jsonwebtoken'); var User = require('../models/user'); var mongoose = require('mongoose'); var WorkPosition = require('../models/work-position'); router.get('/:userId', function(req, res, next) { const userId = req.params.userId; WorkPosition.find({employees: {$elemMatch : {$eq: userId}}}) .exec(function(err, workPositions) { if(err) { return res.status(500).json({ title: 'an error has occurred', error: err }); } console.log(userId); console.log(workPositions); res.status(200).json({ message: 'Success', obj: workPositions }); }); }); 

当我尝试使用$ elemMatch方法时出现问题。 上面的代码,当WorkPosition.find行更改为

 WorkPosition.find() 

没有任何条件

 {employees: {$elemMatch : {$eq: userId}}} 

)里面,我成功地能够检索我想要的WorkPosition文档。

但是,我只想检索WorkPosition文档,其中WorkPosition中的'employees'字段与我从req.params收到的'userId'匹配。 因此,我通过mongodb / mongoose API( http://mongoosejs.com/docs/api.html#query_Query-elemMatch )

在那里我find了$ elemMatch方法。

在MongoDB的shell里,当我做的时候

 db.workpositions.find({"employees": { $elemMatch : {$eq: "596823efbac11d1978ba2ee9"}}}) 

其中“5968 ….”是userId,我成功地能够查询WorkPosition文档。

通过这个命令,我能够validation我的逻辑是正确的,使用mongodb本地shell命令可以获得我想要的文档。

但是,当我尝试将相同的逻辑转换为Mongoose API时,它是:

 WorkPosition.find().elemMatch('employees', {$eq : userId}) 

我得到一个空的数组,并添加行

 mongoose.set('debug', function (coll, method, query, doc) { console.log(coll + " " + method + " " + JSON.stringify(query) + " " + JSON.stringify(doc)); }); 

在/app.js中,我能够看到什么mongoose查询转换为本地mongodb命令是:

 workpositions find {"employees":{"$elemMatch":{"$eq":"596823efbac11d1978ba2ee9"}}} {"fields":{}} 

。 集合(工作位置),方法(查找),数组寻找(员工)和一切正确翻译成本地mongodb命令除外

 "$eq" 

。 成功工作的shell命令和我的代码中的mongoose命令之间的唯一区别是'$ eq'周围的附加引号。

贝壳:

 db.workpositions.find({"employees": { $elemMatch : {$eq: "596823efbac11d1978ba2ee9"}}}) 

mongoose:

 db.workpositions.find({"employees": { $elemMatch : {"$eq": "596823efbac11d1978ba2ee9"}}}) 

我似乎无法find摆脱这些额外的引号(我相信是问题的原因)的方法。 我尝试使用mongoose的本地命令,如:

 mongoose.connection.db.workpositions.find(.....) 

但这也会导致错误。

什么是通过mongoose使用elemMatch的正确方法? 任何人都可以启发我如何使用它? 我想尽一切办法,似乎无法解决这个问题。

我正在考虑改变WorkPosition.employees字段,以便它拥有实际的用户(不仅是userIds),我可以parsing与Mongoose elemMatch API完全匹配的其他信息。 但是,我相信这会浪费大量的数据库空间,因为每个WorkPosition必须携带一组用户。

要在用户和WorkPositions之间build立正确的关系,elemMatch是我项目中的一个要求。 我将不胜感激任何帮助!