我有以下代码用于检索MongoDB中的消息,这些消息碰巧有一个按位标志“Status”,这就是为什么我使用内置的BsonJavaScript功能来过滤这些记录的原因。该语句是否会尝试在ToUserId或Status字段上使用索引,即使它使用JavaScript语法进行查询评估?
public long NewMessageCount
{
get
{
var script = CreateScript("Status", MessageStatus.Unread);
return MongoConnectionHandler.MongoCollection.Count(Query.Where(script));
}
}
public string ToUserId = "51e8dd21d84513129c644fa6";
public string CreateScript(string field, MessageStatus filter)
{
return String.Format("this.ToUserId == '{0}' && (this.{1} & {2}) == {3}", ToUserId, field, (int)filter);
}
答案 0 :(得分:1)
根据MongoDB 2.4上$where
的文档:
$where evaluates JavaScript and cannot take advantage of indexes.
我建议您在MongoDB问题跟踪器中观看/ upvote SERVER-3518,这是对按位查询运算符的功能请求。
除了将标志复制到不需要按位查询或使用低效$where
查询的布尔字段之外,暂时没有一个好的解决方法。