sql >> データベース >  >> NoSQL >> MongoDB

MongoDBインデックスを作成または更新する方法はありますか?

    ドライバー を見る CreateOrUpdateIndexを実装しました 生のインデックスドキュメントを比較し、インデックスオプションが変更された場合、インデックスが置き換えられる拡張メソッド(インデックス名が同じである限り):

    public static WriteConcernResult CreateOrUpdateIndex(
        this MongoCollection mongoCollection,
        IMongoIndexKeys keys,
        IMongoIndexOptions options = null)
    {
        if (mongoCollection.IndexExists(keys))
        {
            var indexDocument = mongoCollection.GenerateIndexDocument(keys, options);
            if (!mongoCollection.GetIndexes().RawDocuments.Any(indexDocument.Equals))
            {
                mongoCollection.DropIndex(keys);
            }
        }
    
        return mongoCollection.CreateIndex(keys, options);
    }
    

    生のインデックスドキュメントの生成:

    public static BsonDocument GenerateIndexDocument(this MongoCollection mongoCollection, IMongoIndexKeys keys, IMongoIndexOptions options)
    {
        var optionsDocument = options.ToBsonDocument();
        var keysDocument = keys.ToBsonDocument();
        var indexDocument = new BsonDocument
        {
            { "ns", mongoCollection.FullName },
            { "name", GenerateIndexName(keysDocument, optionsDocument) },
            { "key", keysDocument }
        };
        if (optionsDocument != null)
        {
            indexDocument.Merge(optionsDocument);
        }
    
        return indexDocument;
    }
    
    public static string GenerateIndexName(IEnumerable<BsonElement> keys, BsonDocument options)
    {
        const string name = "name";
        if (options != null && options.Contains(name)) return options[name].AsString;
    
        return string.Join("_", keys.Select(element =>
        {
            var value = "x";
            switch (element.Value.BsonType)
            {
                case BsonType.Int32: value = ((BsonInt32)element.Value).Value.ToString(); break;
                case BsonType.Int64: value = ((BsonInt64)element.Value).Value.ToString(); break;
                case BsonType.Double: value = ((BsonDouble)element.Value).Value.ToString(); break;
                case BsonType.String: value = ((BsonString)element.Value).Value; break;
            }
            return string.Format("{0}_{1}", element.Name, value.Replace(' ', '_'));
        }));
    }
    


    1. db.stats()はMongoDBのブロッキング呼び出しですか?

    2. Redisを使用したDjangoでのキャッシュ

    3. デフォルトのビューエンジンが定義されていないことをExpressが教えてくれるのはなぜですか?

    4. Google Cloud Functionsは、HTTPリクエストごとにMongoDBクライアントに再接続しますか?