如果mongodbDriver已存在,则更新整个文档

时间:2019-07-16 23:05:29

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

我正在使用mongodb驱动程序,插入没问题,但这将导致我获得具有相同ID的多个文档。

我要做的是将UpdateOne与upsert一起使用,如果找到ID,则更新我的文档,或者如果找不到ID,则仅插入。

我正在使用NET Framework 4.5使用MongoDB.Driver 2.8.1,我在一些论坛上阅读了一些有关我的问题的示例文档,但无法解决。

这是我遇到问题的代码部分。

        {
            var client = new MongoClient(getMongoConect());
            var database = client.GetDatabase("Example");
            var collection = database.GetCollection<BsonDocument>("Data");
            var upsert = new UpdateOptions { IsUpsert = true };

            var variables = new BsonDocument
            {
                {"op_id", transaction.ID },
                {"op_box", transaction.Operation},
                {"RegisterDate",transaction.TodayDate },
                {"ProcedureKind",transaction.Procedure},
                {"User",transaction.RegisterUser },
                {"Status", transaction.ProcedureStatus},
                {"Ofice", transaction.OficeNumber }
            };

            var filter = Builders<BsonDocument>.Filter.Eq("op_id", transaction.ID);
            var update = Builders<BsonDocument>.Update.Set("op_id", transaction.ID);

            var object= collection.Find(filter);

            //Works with no problems, but give me trash at the DB.
            //collection.InsertOne(variables);
            //Trying to update document if op_id exist or insert if not
            collection.UpdateOne(filter,update,upsert);
        }

如果没有找到ID,我希望Collection.UpdateOne保存整个文档,如果存在,请更新它。

1 个答案:

答案 0 :(得分:1)

这是我将如何处理整个文档的方法。该代码还显示了如何仅更新现有文档的某些字段。

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;

namespace StackOverflow
{
    public class Program
    {
        public class Data
        {
            [BsonId]
            public ObjectId op_id { get; set; }
            public string op_box { get; set; }
            public string office { get; set; }
        }

        private static void Main(string[] args)
        {
            var collection = new MongoClient("mongodb://localhost:27017")
                                 .GetDatabase("Example")
                                 .GetCollection<Data>("Data");

            var id = ObjectId.GenerateNewId();

            //use ReplaceOne when you are inserting or updating whole documents
            collection.ReplaceOne(
                d => d.op_id == id,
                new Data
                {
                    op_id = id,
                    op_box = "box",
                    office = "office"
                },
                new UpdateOptions
                {
                    IsUpsert = true
                });

            //use UpdateOne when you need to update only a few properties/fields
            collection.UpdateOne(
                d => d.op_id == id,
                Builders<Data>.Update.Set(d => d.office, "updated office"));
        }
    }
}

我写了library简化了很多工作。检查一下是否可以使用.net核心框架。有了它,您只需执行object.Save(),它就可以处理upserting。