MongoDB:在数组中查找一个objectId

5

我在查询数据库时遇到了问题,我想获取所有具有例如:管理员“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
}

Schema模型是:

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' }]
}
);

你解决了这个问题吗?我也遇到了完全相同的问题。我也想要查找数组中的对象ID。你能解决这个问题吗? - Aadi
5个回答

8
将id字符串转换为ObjectId:
var mongoose = require('mongoose'),
    trainerId = '54bd13864ec56c7c12310a79';
var id = mongoose.Types.ObjectId(trainerId);

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

1
你已经走在解决方案的路上了: 代码如下:var trainerId = mongoose.Schema.Types.ObjectId(trainerId);
GroupSchema.find({'admins': { $in: [ trainerId ] }}我标记了你的回答,谢谢 :)
- Aviram Fireberger
1
@AviramFireberger,我不确定为什么你要使用$in,因为只使用{admins: ObjectId('EXAMPLE')}也应该可以工作。 - shmup
@badteeth 我真的记不起来为什么了... 那是7年前哈哈 - Aviram Fireberger

5

这是ObjectId:

ObjectId("54bd13864ec56c7c12310a79")

这是字符串:

trainerId = '54bd13864ec56c7c12310a79'

所以你的查询可能需要使用ObjectId。


4
如果我理解你的问题正确,你可能想要使用$elemMatch来实现这个目的。当你想要检查非数组字段是否等于传递给$in的数组中指定的一个值时,应该使用$in。

在 ObjectId 的情况下,我该如何使用 $elemMatch? 我尝试了以下代码:db.groups.find('admins' : { $elemMatch : {'54b932c7ac3ec34a85e6246c'} } ),但它并没有起作用。 - Aviram Fireberger
尝试使用 { $elemMatch : { $eq: '54b932c7ac3ec34a85e6246c'} } - Prusse
1
{ $elemMatch : { $eq: ObjectId("54b932c7ac3ec34a85e6246c")} } 应该可以工作。 - raner

2
如果我理解你的问题正确,你可以尝试使用聚合操作中的$unwind,将管理员中的元素分开。

2
看起来你想用子文档id匹配父文档。你可以使用一个简单的查询: GroupSchema.find({'admins._id': trainerId}) 或者你可以使用$elemMatch,但是如文档所说,这并不是必需的:如果在$elemMatch表达式中只指定了一个条件,则不需要使用$elemMatch。 GroupSchema.find({admins: {$elemMatch: {_id: trainerId}}}) 至于将字符串值转换为ObjectId,mongoose会在内部自动执行此操作。

我在两个查询中都没有收到异常,但是我确实得到了0个结果。 我已经仔细检查了ID...它是正确的。 无论是“.find({'admins': {$elemMatch: {'_id': '54b932c7ac3ec34a85e6256c'}}})”还是“.find({'admins._id': '54b932c7ac3ec34a85e6256c'}})”都没有起作用。 - Aviram Fireberger
1
GroupSchema是什么?约定使用内部模型名称作为模型对象名称:Group。也就是说,如果您正在使用mongoose,则必须将字符串值转换为ObjectId非常奇怪。您可以发布您正在使用的mongoose版本以及GroupSchema是什么吗? - Jason Cust

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接