Javascript MongoDB:按数组中的一个objectId查找

Javascript MongoDB:按数组中的一个objectId查找,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我在查询数据库时遇到问题,我想获取所有元素,例如:admins数组中的admin“54bd13864ec56c7c12310a79” 用“$in”尝试了一下,但没有成功,这可能与它是ObjectId有关吗 trainerId = '54bd13864ec56c7c12310a79' GroupSchema.find({'admins': { $in: [ trainerId ] }} 这是我的数据库: { "_id" : ObjectId("54b93e8e3801ae381e3433b

我在查询数据库时遇到问题,我想获取所有元素,例如:admins数组中的admin“54bd13864ec56c7c12310a79”

用“$in”尝试了一下,但没有成功,这可能与它是ObjectId有关吗

trainerId = '54bd13864ec56c7c12310a79'
GroupSchema.find({'admins': { $in: [ trainerId ] }}
这是我的数据库:

{
   "_id" : ObjectId("54b93e8e3801ae381e3433be"),
   "groupName" : "Developers Groups",
   "createdBy" : "Ido",
   "creationDate" : "Jan 16 2015",
   "users" : [ 
       ObjectId("54b932c7ac3ec34a85e6246c")
   ],
   "admins" : [ 
       ObjectId("54b932c7ac3ec34a85e6246c"), 
       ObjectId("54bd13864ec56c7c12310a79")
   ],
   "__v" : 0
}
模式模型为:

module.exports = mongoose.model('Groups' ,
{
    groupName: String,
    createdBy: String,
    creationDate: String,
    admins: [{ type : mongoose.Schema.Types.ObjectId, ref: 'Users' }],
    users: [{ type : mongoose.Schema.Types.ObjectId, ref: 'Users' }]
}
);

如果我没弄错你的问题,你可能想用这个$当您要检查非数组字段是否等于传递给$in的数组中指定的值之一时,应使用in。

如果我正确理解您的问题,您可能可以尝试聚合中的
$unwind
,在admins中分离元素。

这是ObjectId:

ObjectId(“54bd13864ec56c7c12310a79”)

这是字符串:

trainerId='54bd13864ec56c7c12310a79'


因此,也许您应该在查询中使用ObjectId。

将id字符串转换为ObjectId:

var mongoose = require('mongoose'),
    trainerId = '54bd13864ec56c7c12310a79';
var id = mongoose.Types.ObjectId(trainerId);

GroupSchema.find({'admins': id });

您似乎希望将父文档与子文档id相匹配。您可以使用以下简单查询:

GroupSchema.find({'admins.\u id':trainerId}})

或者您可以使用,但正如文档所说,这是不必要的:如果您在$elemMatch表达式中只指定一个条件,则不需要使用$elemMatch

GroupSchema.find({admins:{$elemMatch:{{{u id:trainerId}}}})


至于将字符串值强制转换为
ObjectId
,mongoose将在内部自动为您执行此操作。

如果是ObjectId,我如何使用$elemMatch?我尝试了:db.groups.find('admins':{$elemMatch:{'54b932c7ac3ec34a85e6246c'}),但没有很好地工作。
{$elemMatch:{$eq:'54b932c7ac3ec34a85e6246c'}
{$elemMatch:{$eq:ObjectId(“54b932c7ac3ec34a85e6246c”)}应该可以很好地解决问题,因为我的方法是:var trainerId=mongoose.Schema.Types.ObjectId(trainerId);GroupSchema.find({'admins':{$in:[trainerId]}}我将您的标记为正确的答案,谢谢:)我没有在这两个方面都得到异常,但我得到了0个结果。我仔细检查了身份证。。。这是正确的。“.find({'admins':{$elemMatch:{'u id':'54b932c7ac3ec34a85e6256c'}}}})”和“.find({'admins.'u id':'54b932c7ac3ec34a85e6256c'}})”都不起作用
组架构是什么?约定使用内部模型名称作为模型对象名称:
Group
。也就是说,如果使用mongoose,那么必须将字符串值强制转换为ObjectId,这是非常奇怪的。您能否发布您正在使用的mongoose版本以及
GroupSchema
是什么?