我正在使用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保存整个文档,如果存在,请更新它。
答案 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。