MongoDB:按数组中的一个objectId查找
MongoDB: find by one objectId in array
我在查询数据库时遇到问题,我想获取所有元素,例如: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' }]
}
);
如果我正确理解你的问题,你可能想为此使用 $elemMatch。当您要检查非数组字段是否等于您传递给 $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._id': trainerId}})
或者您可以使用 $elemMatch,但正如文档所说,这不是必需的:如果您在 $elemMatch 表达式中仅指定一个条件,则不需要使用 $elemMatch .
GroupSchema.find({admins: {$elemMatch: {_id: trainerId}}})
至于将字符串值转换为 ObjectId
,mongoose 会在内部自动为您执行此操作。
我在查询数据库时遇到问题,我想获取所有元素,例如: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' }]
}
);
如果我正确理解你的问题,你可能想为此使用 $elemMatch。当您要检查非数组字段是否等于您传递给 $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._id': trainerId}})
或者您可以使用 $elemMatch,但正如文档所说,这不是必需的:如果您在 $elemMatch 表达式中仅指定一个条件,则不需要使用 $elemMatch .
GroupSchema.find({admins: {$elemMatch: {_id: trainerId}}})
至于将字符串值转换为 ObjectId
,mongoose 会在内部自动为您执行此操作。