如果已存在 mongodb 驱动程序,则更新整个文档

Updating whole Document if already exist with mongodbDriver

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

我想做的是将 UpdateOne 与更新插入一起使用,如果找到 ID 则更新我的文档,或者如果没有找到 ID 则直接插入。

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

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

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

我希望 Collection.UpdateOne 在找不到 id 时保存整个文档,如果找到则更新它。

下面是我将如何更新整个文档。代码还展示了如何仅更新现有文档的某些字段。

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

namespace Whosebug
{
    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(),它会负责更新。