Модель:
[BsonIgnoreExtraElements]
public class UserPortfolioList
{
public string? Username { get; set; }
public List<Pflist>? Pflist { get; set; }
}
public class Pflist
{
public string PfName { get; set; } = "DEFAULT NAME";
public List<string>? Symbols { get; set; }
}
Существующий документ MongoDB:
{
"username": "aaa",
"pflist": [
{
"pfName": "US TECH A",
"symbols": [
"GOOG",
"MSFT"
]
}
]
}
Массив, который я хочу отправить (то же имя пользователя, но разные pfName и символы)
{
"username": "aaa",
"pflist": [
{
"pfName": "US TECH C",
"symbols": [
"AAPL",
"TSLA"
]
}
]
}
Ожидаемый результат:
{
"username": "aaa",
"pflist": [
{
"pfName": "US TECH A",
"symbols": [
"GOOG",
"MSFT"
]
},
{
"pfName": "US TECH C",
"symbols": [
"AAPL",
"TSLA"
]
}
]
}
Код:
public async Task UpdateUserPfAsync(UserPortfolioList userPflist)
await _UserPortfoliosCollection.UpdateOneAsync(Builders<UserPortfolioList>.Filter.Eq(
"Username", userPflist.Username),
Builders<UserPortfolioList>.Update.Push(x => x.Pflist, userPflist.Pflist));
Компилятор выдает ошибку:
can not convert lambda express to type......
Я испробовал почти все подходы к StackOverflow, но ни один из них не работает для меня.
Пожалуйста помоги. Благодарю вас!
Беспокойство:
Поскольку вы добавляете один объект в pflist
, вы должны использовать userPflist.Pflist[0]
вместо userPflist.Pflist
, так как с userPflist.Pflist
это приведет к результату:
{
username: "aaa",
pflist: [
0: Object
1: Array
0: Object
]
}
Вставить один элемент в массив
Запрос MongoDB:
db.collection.update({
username: "aaa"
},
{
$push: {
"pflist": {
"pfName": "US TECH C",
"symbols": [
"AAPL",
"TSLA"
]
}
}
})
Пример игровой площадки Mongo (отправьте один элемент в массив)
МонгоДБ С#:
await _UserPortfoliosCollection.UpdateOneAsync(
Builders<UserPortfolioList>.Filter.Eq("Username", userPflist.Username),
Builders<UserPortfolioList>.Update.Push(x => x.Pflist, userPflist.Pflist[0]));
Примечание. Лямбда-выражение для .Push()
работает, если значение является объектом вместо массива.
Вставьте несколько элементов в массив
Чтобы поместить несколько элементов в массив, вам нужен оператор $each
.
Запрос MongoDB:
db.collection.update({
username: "aaa"
},
{
$push: {
"pflist": {
$each: [
{
"pfName": "US TECH C",
"symbols": [
"AAPL",
"TSLA"
]
}
]
}
}
})
Образец игровой площадки Mongo
МонгоДБ С#:
await _UserPortfoliosCollection.UpdateOneAsync(
Builders<UserPortfolioList>.Filter.Eq("Username", userPflist.Username),
Builders<UserPortfolioList>.Update.PushEach(x => x.Pflist, userPflist.Pflist));
Update Result
Большой!!! Спасибо!