#c# #mongodb #nosql #mongodb-.net-driver
#c# #mongodb #nosql #mongodb-.net-driver
Вопрос:
Например, у нас есть коллекция:
{
"Request":{
"RequestCode":1,
"Note":"test updated",
"Results":[
{
"ResultCode":1,
"Name":"Test",
"Value":10
},
{
"ResultCode":2,
"Name":"Second result",
"Value":15
}
]
}
}
В следующей операции мы получили:
{
"Request":{
"RequestCode":1,
"Note":"test updated again",//UPDATED
"Results":[
{
"ResultCode":1,
"Name":"Test",
"Value":15 //UPDATED
},
{
"ResultCode":2,
"Name":"Second result",
"Value":15
},
{ //ADDED
"ResultCode":3,
"Name":"Third result",
"Value":14
}
]
}
}
- Мне нужно создать запрос, если он не существует, и обновить его, если он
существует. - Для вложенной коллекции мне нужно вставить элемент, если результат с некоторым результирующим кодом не существует, или обновить / заменить, если результат с некоторым результирующим кодом существует.
Возможно ли выполнить массовую вставку в MongoDB? Или мне просто нужно сначала проверить, существует ли запрос, а затем обновить все значения внутри него или создать его, а после этого просмотреть все результаты в полученной коллекции и проверить, существует ли какой-либо код результата в уже сохраненной коллекции? Если да, то обновите все поля внутри, если нет, то вставьте результат в коллекцию результатов
Не могли бы вы порекомендовать какие-нибудь хорошие источники с примерами mongodb для c #?
Комментарии:
1. Что такое вложенная коллекция?
2. @D.SM В этом примере вложенной коллекцией является «Результаты». Я хотел бы знать, возможно ли массовое обновление в MongoDB?
3.Смотрите docs.mongodb.com/manual/reference/operator/update/….
Ответ №1:
В настоящее время мое решение выглядит так:
var collection = GetCollection();
var filter = Builders<Request>.Filter.Eq(e => e.RequestCode, model.RequestCode);
var definition = Builders<Request>.Update
.SetOnInsert(e => e.RequestCode, model.RequestCode)
.Set(e => e.Note, model.Note)
.SetOnInsert(e => e.Results, new List<Result>());
await collection.UpdateOneAsync(filter, definition, new UpdateOptions { IsUpsert = true });
var currentRequest = await FindOneAsync(x => x.RequestCode == model.RequestCode);
foreach (var result in model.Results)
{
var currentResult = currentRequest.Results.FirstOrDefault(
e => e.ResultCode == result.ResultCode);
if (currentResult == null)
{
currentRequest.Results.Add(new Result
{
ResultCode = result.ResultCode,
Name = result.Name,
Value = result.Range
});
}
else
{
currentResult.ResultCode = result.ResultCode;
currentResult.Name = result.Name;
currentResult.Value= result.Value;
}
}
await collection.FindOneAndReplaceAsync(e => e.RequestCode== request.RequestCode, currentRequest);
Может быть, можно сделать это лучше?