0

ビットごとのフラグ「ステータス」を持つMongoDBでメッセージを取得するための次のコードがあります。そのため、これらのレコードをフィルタリングするために組み込みのBsonJavaScript機能を使用しています。ステートメントは、クエリ評価に JavaScript 構文を使用している場合でも、ToUserId または Status フィールドなどでインデックスを使用しようとしますか?

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);
}
4

1 に答える 1

1

$whereMongoDB 2.4のドキュメントによると:

$where evaluates JavaScript and cannot take advantage of indexes.

MongoDB issue tracker でSERVER-3518を監視/支持することをお勧めします。これは、ビット単位のクエリ演算子の機能要求です。

ビット単位のクエリを必要としないブール型フィールドにフラグをコピーするか、非効率的な$whereクエリを使用する以外に、当面の適切な回避策はありません。

于 2013-07-20T01:10:12.640 に答える