在MongoDB中按部分_id值查找/计数文档

时间:2018-10-12 06:52:43

标签: c# mongodb mongodb-.net-driver

我想通过在GUI应用程序中输入的_id局部值来查找集合中的文档。
经过一番搜索,我发现我至少可以使用以下过滤器按其部分ID查找文档:

{ $where: "this._id.str.match(/5a.*/)" }

(其中5a是用户输入的部分ID值)

我处理这些搜索的服务器应用程序还支持分页,因此我总是查询数据库以计算/估计匹配文档的数量。
但是,如果我将这个$where表达式放入我的FilterDefinition并传递给集合中的CountDocumentsAsync(),我将得到一个例外:

MongoDB.Driver.MongoCommandException: Command aggregate failed: $where is not allowed in this context

然后我查看了MongoDB的countDocuments方法,发现$where中不允许使用countDocuments()运算符,而应该使用$expr

不幸的是,我无法与$expr一起使用,因为找不到任何有用的示例来帮助我满足特定要求。
我只是尝试将$where表达式包装在$expr表达式中,但这似乎不起作用(Command aggregate failed: Unrecognized expression '$where'

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

假设您的_id为ObjectId类型,则可以将其convert字符串化(可从v4.0获得),然后将其进行正则表达式,而无需使用昂贵的javascript评估:

db.collection.aggregate([
    { $addFields: { 
        _idString: { $toString: "$_id" } 
    } },
    { $match: { _idString: /5a.*/ } }
] )

请注意,正则表达式/5a.*//5a/完全匹配相同的字符串。