Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose elemMatch返回一个空数组_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongoose elemMatch返回一个空数组

Node.js Mongoose elemMatch返回一个空数组,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我目前正在构建一个web应用程序,我偶然发现了一个在过去12小时内无法解决的问题 我正在研究一种基本的get方法,在这种方法中,我试图检索员工正在担任的某些工作职位(即出纳、职员)(客户端工作得非常完美) WorkPosition的mongoose模型如下(models/work position.js): 我的获取方法(routes/work position.js): 当我尝试使用$elemMatch方法时,问题就出现了。当WorkPosition.find行更改为 WorkPosition

我目前正在构建一个web应用程序,我偶然发现了一个在过去12小时内无法解决的问题

我正在研究一种基本的get方法,在这种方法中,我试图检索员工正在担任的某些工作职位(即出纳、职员)(客户端工作得非常完美)

WorkPosition的mongoose模型如下(models/work position.js):

我的获取方法(routes/work position.js):

当我尝试使用$elemMatch方法时,问题就出现了。当WorkPosition.find行更改为

WorkPosition.find()
没有任何条件(

)在内部,我成功地检索到了所需的WorkPosition文档

但是,我只想检索WorkPosition中的“employees”字段与我从req.params收到的“userId”匹配的WorkPosition文档。因此,我搜索了mongodb/MongooseAPI()

在那里我找到了$elemMatch方法

在mongodb shell中,当我这样做时

db.workpositions.find({"employees": { $elemMatch : {$eq: "596823efbac11d1978ba2ee9"}}})
其中“5968….”是用户ID,我能够成功地查询WorkPosition文档

通过这个命令,我可以验证我的逻辑是否正确,并且使用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":{}}
。集合(workpositions)、方法(find)、数组(employees)和所有内容都正确转换为本机mongodb命令,除了

"$eq"
。在我的代码中,成功运行的shell命令和mongoose命令之间的唯一区别是“$eq”周围有额外的引号

外壳:

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

db.workpositions.find({"employees": { $elemMatch : {"$eq": "596823efbac11d1978ba2ee9"}}})
我似乎找不到摆脱这些额外引号的方法(我认为这是问题的原因)。我尝试对mongoose使用本机命令,如:

mongoose.connection.db.workpositions.find(.....)
但这也会导致错误

通过猫鼬使用elemMatch的正确方式是什么?谁能教我如何使用它吗?我想尽了一切办法,但我似乎无法克服这个问题

我正在考虑更改WorkPosition.employees字段,以便它包含实际用户(而不仅仅是用户ID),并且我可以使用与Mongoose elemMatch API完全匹配的附加信息进行解析。但是,我相信这将浪费大量的数据库空间,因为每个工作位置都必须承载一组用户


为了在用户和工作位置之间建立正确的关系,elemMatch是我的项目中的一项要求。我将非常感谢任何帮助

在比较mongodb ObjectId时,请在$eq数组操作符周围使用mongoose.Types.ObjectId,然后您可以检索与$elemMatch操作符匹配条件的第一个文档

$elemMatch:{$eq:mongoose.Types.ObjectId(userId)}


因为您的employees字段只是一个ID数组,所以当我执行
db.workpositions.find({“employees”):{$elemMatch:{$eq:{$eq:{$eq:“596823efbac11d1978ba2ee9”}}}时,您是否可以在mongodb shell中引用您的问题。这就是你的问题。如果您可以在“shell”中运行该查询,那么
“employees”
的内容实际上是“字符串”,而不是您的模式所期望的
ObjectId
值。似乎您现有的数据存在问题,您需要将这些条目改为
ObjectId
值。shell查询应该失败,因为您没有强制转换该值。Mongoose正在尝试强制转换该值。为了将来参考,请始终将
Mongoose.set('debug',true)
添加到程序中。这将记录从mongoose模型发出的所有查询,然后您应该能够看到与刚才所示的明显差异。首先,感谢@NeilLunn指出我犯的一个小但大的错误。我的文档和架构之间不一致(字符串不是ObjectId!)。elemMatch成功返回我想要的@SteveHolgado我担心如果字段是数组,find({employees:userId})将不起作用,但我已经尝试过了,并且也成功地起到了作用。谢谢你们两位!
db.workpositions.find({"employees": { $elemMatch : {$eq: "596823efbac11d1978ba2ee9"}}})
db.workpositions.find({"employees": { $elemMatch : {"$eq": "596823efbac11d1978ba2ee9"}}})
mongoose.connection.db.workpositions.find(.....)