如果已存在 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()
,它会负责更新。
我正在使用 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()
,它会负责更新。