MongoDB:在数组中通过一个objectId查找

时间:2015-04-16 14:22:30

标签: javascript node.js mongodb mongoose

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

用" $ in"但它没有起作用,它是否与它的ObjectId相关?

trainerId = '54bd13864ec56c7c12310a79'
GroupSchema.find({'admins': { $in: [ trainerId ] }}

这是我的db:

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

5 个答案:

答案 0 :(得分:4)

这是ObjectId:

  

的ObjectId(" 54bd13864ec56c7c12310a79&#34)

这是字符串:

  

trainerId =' 54bd13864ec56c7c12310a79'

所以也许你应该在你的查询中使用ObjectId。

答案 1 :(得分:1)

如果我正确理解您的问题,您可能希望使用$elemMatch。如果要检查非数组字段是否等于传递给$ in的数组中指定的值之一,则应使用$ in。

答案 2 :(得分:1)

如果我理解你的问题,你可能会在聚合中尝试$unwind,将管理员中的元素分开。

答案 3 :(得分:1)

将id字符串转换为ObjectId:

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

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

答案 4 :(得分:1)

看起来您希望将父文档与子文档ID匹配。您可以使用简单的查询:

GroupSchema.find({'admins._id': trainerId}})

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

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

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