Нажмите элемент в глубоко вложенный массив, если он не существует (MongoDB с драйвером C#)C#

Место общения программистов C#
Ответить
Anonymous
 Нажмите элемент в глубоко вложенный массив, если он не существует (MongoDB с драйвером C#)

Сообщение Anonymous »

Мне нужна помощь с этим вопросом. У меня следующая структура -

Код: Выделить всё

 {
"UserWatchlistSetting":{
"Id": "b85ff2af-d745-4089-9683-b25c675a5406",
"UserId": "de3f2757-b919-4091-9169-f5676573cd8e",
"Watchlists": [
{
"Id": "2d02a950-b91f-453f-ac7f-b56ad303ec64"
"TradingAccountNumber": 100500,
"Name": "MyWatchList",
"Symbols": [
{
"SymbolId": "7b977976-28b7-43d7-8acd-a3ae2ba9a463",
"SymbolName": "SomeTradeSymbol1",
"CreationDate": "2024-11-25T19:03:27.4678031+03:00"
},
{
"SymbolId": "7b977976-28b7-43d7-8acd-a3ae2ba9a463",
"SymbolName": "SomeTradeSymbol2",
"CreationDate": "2024-11-25T19:03:27.4678031+03:00"
}
],
"Created": "2024-11-25T17:50:57.6531431+03:00"
}
],
"Created": "2024-11-25T17:50:57.6464593+03:00",
"Updated": "2024-11-25T17:59:22.6826342+03:00"
}
}
Мне нужно добавить в документ новые символы (UserWatchlistSetting.Watchlists.Symbols), причем символы не должны повторяться. То есть, если символ с определенным идентификатором уже существует, то другой символ с таким же идентификатором (даже если имя символа или дата создания разные) не должен добавляться в список.
Я пробовал работать в следующем направлении -

Код: Выделить всё

   var baseFilter = Builders.Filter.Eq(x => x.UserId, userId);

var update = Builders.Update
.Push("Watchlists.$[d].Symbols", new Symbol { SymbolId = request.SymbolId, Name = request.SymbolName, Created = DateTime.UtcNow });

var filter1 = new BsonDocument("d.Id", $"{request.watchlistId}");
var filter2 = new BsonDocument("d.Symbols", new BsonDocument("$not", new BsonDocument("$elemMatch", new BsonDocument("SymbolId", $"{request.SymbolId}"))));

var arrayFilters = new List
{
new BsonDocumentArrayFilterDefinition(new BsonDocument("$and",new BsonArray(){ filter1, filter2}))
};

return await mongoCollection.FindOneAndUpdateAsync(
baseFilter,
update,
new FindOneAndUpdateOptions { IsUpsert = true, ReturnDocument = ReturnDocument.After, ArrayFilters = arrayFilters });
Этот код выполняется без ошибок, но символ не добавляется.

Подробнее здесь: https://stackoverflow.com/questions/793 ... arp-driver
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»