web-dev-qa-db-ja.com

C#mongodbドライバー2.0-一括操作でアップサートする方法は?

1.9から2.2に移行し、 ドキュメントを読む 操作でオプションが許可されていないため、一括操作中にアップサートできないことに驚きました。

bulkOps.Add(new UpdateOneModel<BsonDocument>(filter, update));
collection.BulkWrite(bulkOps);

する必要があります

options.isUpsert = true;
bulkOps.Add(new UpdateOneModel<BsonDocument>(filter, update, options));
collection.BulkWrite(bulkOps);

この作業は進行中ですか、意図されていますか、それとも何かが足りませんか?ありがとうございました。

12
Adrian Lopez

IsUpsertの-​​ UpdateOneModel プロパティをtrueに設定して、更新をアップサートに変換します。

var upsertOne = new UpdateOneModel<BsonDocument>(filter, update) { IsUpsert = true };
bulkOps.Add(upsertOne);
collection.BulkWrite(bulkOps);
20
JohnnyHK

与えられたmongoコレクション

IMongoCollection<T> collection

tがIdフィールドを持つ場所に挿入するレコードの列挙可能。

IEnumerable<T> records 

このスニペットは一括アップサートを実行します(フィルター条件は状況に応じて変更される場合があります)。

var bulkOps = new List<WriteModel<T>>();
foreach (var record in records)
{
    var upsertOne = new ReplaceOneModel<T>(
        Builders<T>.Filter.Where(x => x.Id == record.Id),
        record)
    { IsUpsert = true };
    bulkOps.Add(upsertOne);
}
collection.BulkWrite(bulkOps);
9
Aviko

@Avikoの応答に基づく拡張メソッドは次のとおりです

public static BulkWriteResult<T> BulkUpsert<T>(this IMongoCollection<T> collection, IEnumerable<T> records)
    {
        string keyname = "_id";

        #region Get Primary Key Name 
        PropertyInfo[] props = typeof(T).GetProperties();

        foreach (PropertyInfo prop in props)
        {
            object[] attrs = prop.GetCustomAttributes(true);
            foreach (object attr in attrs)
            {
                BsonIdAttribute authAttr = attr as BsonIdAttribute;
                if (authAttr != null)
                {
                    keyname = prop.Name;
                }
            }
        }
        #endregion

        var bulkOps = new List<WriteModel<T>>();


        foreach (var entry in records)
        {
            var filter = Builders<T>.Filter.Eq(keyname, entry.GetType().GetProperty(keyname).GetValue(entry, null));

            var upsertOne = new ReplaceOneModel<T>(filter, entry){ IsUpsert = true };

            bulkOps.Add(upsertOne);
        }

        return collection.BulkWrite(bulkOps);

    }
0
Abba