Я использую MongoDB.Driver 3.6 с Visual Studio 2026 для консольного приложения .NET 9.0.
Я пытаюсь обновить вложенный документ, используя значение ID, чтобы указать обновляемый документ. Если я использую имя документа, то это работает. Но со строкой ID документ не найден.
Строки в этом блоке, использующие Id, не работают.
UpdateResult updateResult = collection.UpdateOne(combinedFilter, updateDefinition,
new UpdateOptions
{
ArrayFilters = new ArrayFilterDefinition[]
{
new BsonDocumentArrayFilterDefinition
(
// new BsonDocument("p.PlayerName", "Greg") // this works
// new BsonDocument("p.Id", BsonValue.Create(GregsIdAsString)) // this does NOT work
new BsonDocument("p.Id", GregsIdAsString) // this also does NOT work.
)
}
});
Мой вопрос: как я могу настроить таргетинг на документ, используя строку идентификатора?
Код указан ниже, а проект доступен здесь.
Program.cs:
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
namespace UpdateSubDocument
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Testing updating subdocument properties");
MongoClient? mongoClient = new MongoClient("mongodb://127.0.0.1:27017/");
IMongoDatabase? iMongoDatabase = mongoClient.GetDatabase("BasicMongoDbTesting");
var collection = CreateTheDocs(iMongoDatabase); // Create the Teams
FilterDefinition filterAllDocs = Builders.Filter.Empty;
IFindFluent allDocsCollection = collection.Find(filterAllDocs);
List allDocs = allDocsCollection.ToList();
string GregsIdAsString = string.Empty;
foreach (Team doc in allDocs)
{
Console.WriteLine(doc.TeamName);
List
players = doc.Players;
foreach (Player player in players)
{
Console.WriteLine($"Player: {player.PlayerName} :: {player.Id}");
if (player.PlayerName.Equals("Greg"))
{
GregsIdAsString = player.Id;
}
}
}
List newColors = new List() { "peach", "periwinkle" };
// AT THIS POINT Greg HAS COLORS gold and ganja
var filterTeam = Builders.Filter.Eq("TeamName", "GoldDiggers");
var filterPlayer = Builders.Filter.Eq("PlayerName", "Greg");
var filterTeamPlayers = Builders.Filter.ElemMatch(x => x.Players, filterPlayer);
var combinedFilter = filterTeam & filterTeamPlayers;
// NOW replace Greg's colors with peach and periwinkle
UpdateDefinition updateDefinition = Builders.Update.Set(doc => doc.Players.AllMatchingElements("p").PlayerColors, newColors);
UpdateResult updateResult = collection.UpdateOne(combinedFilter, updateDefinition,
new UpdateOptions
{
ArrayFilters = new ArrayFilterDefinition[]
{
new BsonDocumentArrayFilterDefinition
(
// new BsonDocument("p.PlayerName", "Greg") // this works
// new BsonDocument("p.Id", BsonValue.Create(GregsIdAsString)) // this does NOT work
new BsonDocument("p.Id", GregsIdAsString) // this also does not work.
)
}
});
Console.WriteLine("Update results of ModifiedCount: " + updateResult.ModifiedCount);
}
public static IMongoCollection CreateTheDocs(IMongoDatabase? iMongoDatabase)
{
IMongoCollection TeamsCollection;
bool collectionExists = iMongoDatabase.ListCollectionNames().ToList().Contains("Teams");
if (collectionExists)
{
TeamsCollection = iMongoDatabase!.GetCollection("Teams");
iMongoDatabase.DropCollection("Teams");
}
iMongoDatabase.CreateCollection("Teams");
TeamsCollection = iMongoDatabase!.GetCollection("Teams");
Team teamDoc = new() { TeamName = "SandPipers", TeamCode = 5567 };
Player playerDoc = new() { PlayerName = "Suzie" };
playerDoc.AddColor("black");
playerDoc.AddColor("blue");
teamDoc.AddPlayer(playerDoc);
playerDoc = new() { PlayerName = "Sandy" };
playerDoc.AddColor("brown");
playerDoc.AddColor("beige");
teamDoc.AddPlayer(playerDoc);
playerDoc = new() { PlayerName = "Sally" };
playerDoc.AddColor("blonde");
playerDoc.AddColor("bronze");
teamDoc.AddPlayer(playerDoc);
TeamsCollection.InsertOne(teamDoc);
teamDoc = new() { TeamName = "GoldDiggers", TeamCode = 1148 };
playerDoc = new() { PlayerName = "Gary" };
playerDoc.AddColor("green");
playerDoc.AddColor("grey");
teamDoc.AddPlayer(playerDoc);
playerDoc = new() { PlayerName = "Greg" };
playerDoc.AddColor("gold");
playerDoc.AddColor("ganja");
teamDoc.AddPlayer(playerDoc);
playerDoc = new() { PlayerName = "George" };
playerDoc.AddColor("gothBlack");
playerDoc.AddColor("gothamGreen");
teamDoc.AddPlayer(playerDoc);
TeamsCollection.InsertOne(teamDoc);
return TeamsCollection;
}
}
}
Team.cs:
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace UpdateSubDocument
{
public class Team
{
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } = ObjectId.GenerateNewId().ToString();
public required string TeamName { get; set; }
public required int TeamCode { get; set; }
public List
Players { get; set; } = [];
public void AddPlayer(Player player)
{
Players.Add(player);
}
}
}
Player.cs:
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace UpdateSubDocument
{
public class Player
{
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } = ObjectId.GenerateNewId().ToString();
public required string PlayerName { get; set; }
public List PlayerColors { get; set; } = [];
public void AddColor(string color)
{
PlayerColors.Add(color);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... definition
MongoDB .NET Обновите вложенный документ, используя строку идентификатора с ArrayFilterDefinition ⇐ C#
Место общения программистов C#
1772054138
Anonymous
Я использую MongoDB.Driver 3.6 с Visual Studio 2026 для консольного приложения .NET 9.0.
Я пытаюсь обновить вложенный документ, используя значение ID, чтобы указать обновляемый документ. Если я использую имя документа, то это работает. Но со строкой ID документ не найден.
Строки в этом блоке, использующие Id, не работают.
UpdateResult updateResult = collection.UpdateOne(combinedFilter, updateDefinition,
new UpdateOptions
{
ArrayFilters = new ArrayFilterDefinition[]
{
new BsonDocumentArrayFilterDefinition
(
// new BsonDocument("p.PlayerName", "Greg") // this works
// new BsonDocument("p.Id", BsonValue.Create(GregsIdAsString)) // this does NOT work
new BsonDocument("p.Id", GregsIdAsString) // this also does NOT work.
)
}
});
Мой вопрос: как я могу настроить таргетинг на документ, используя строку идентификатора?
Код указан ниже, а проект доступен здесь.
Program.cs:
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
namespace UpdateSubDocument
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Testing updating subdocument properties");
MongoClient? mongoClient = new MongoClient("mongodb://127.0.0.1:27017/");
IMongoDatabase? iMongoDatabase = mongoClient.GetDatabase("BasicMongoDbTesting");
var collection = CreateTheDocs(iMongoDatabase); // Create the Teams
FilterDefinition filterAllDocs = Builders.Filter.Empty;
IFindFluent allDocsCollection = collection.Find(filterAllDocs);
List allDocs = allDocsCollection.ToList();
string GregsIdAsString = string.Empty;
foreach (Team doc in allDocs)
{
Console.WriteLine(doc.TeamName);
List
players = doc.Players;
foreach (Player player in players)
{
Console.WriteLine($"Player: {player.PlayerName} :: {player.Id}");
if (player.PlayerName.Equals("Greg"))
{
GregsIdAsString = player.Id;
}
}
}
List newColors = new List() { "peach", "periwinkle" };
// AT THIS POINT Greg HAS COLORS gold and ganja
var filterTeam = Builders.Filter.Eq("TeamName", "GoldDiggers");
var filterPlayer = Builders.Filter.Eq("PlayerName", "Greg");
var filterTeamPlayers = Builders.Filter.ElemMatch(x => x.Players, filterPlayer);
var combinedFilter = filterTeam & filterTeamPlayers;
// NOW replace Greg's colors with peach and periwinkle
UpdateDefinition updateDefinition = Builders.Update.Set(doc => doc.Players.AllMatchingElements("p").PlayerColors, newColors);
UpdateResult updateResult = collection.UpdateOne(combinedFilter, updateDefinition,
new UpdateOptions
{
ArrayFilters = new ArrayFilterDefinition[]
{
new BsonDocumentArrayFilterDefinition
(
// new BsonDocument("p.PlayerName", "Greg") // this works
// new BsonDocument("p.Id", BsonValue.Create(GregsIdAsString)) // this does NOT work
new BsonDocument("p.Id", GregsIdAsString) // this also does not work.
)
}
});
Console.WriteLine("Update results of ModifiedCount: " + updateResult.ModifiedCount);
}
public static IMongoCollection CreateTheDocs(IMongoDatabase? iMongoDatabase)
{
IMongoCollection TeamsCollection;
bool collectionExists = iMongoDatabase.ListCollectionNames().ToList().Contains("Teams");
if (collectionExists)
{
TeamsCollection = iMongoDatabase!.GetCollection("Teams");
iMongoDatabase.DropCollection("Teams");
}
iMongoDatabase.CreateCollection("Teams");
TeamsCollection = iMongoDatabase!.GetCollection("Teams");
Team teamDoc = new() { TeamName = "SandPipers", TeamCode = 5567 };
Player playerDoc = new() { PlayerName = "Suzie" };
playerDoc.AddColor("black");
playerDoc.AddColor("blue");
teamDoc.AddPlayer(playerDoc);
playerDoc = new() { PlayerName = "Sandy" };
playerDoc.AddColor("brown");
playerDoc.AddColor("beige");
teamDoc.AddPlayer(playerDoc);
playerDoc = new() { PlayerName = "Sally" };
playerDoc.AddColor("blonde");
playerDoc.AddColor("bronze");
teamDoc.AddPlayer(playerDoc);
TeamsCollection.InsertOne(teamDoc);
teamDoc = new() { TeamName = "GoldDiggers", TeamCode = 1148 };
playerDoc = new() { PlayerName = "Gary" };
playerDoc.AddColor("green");
playerDoc.AddColor("grey");
teamDoc.AddPlayer(playerDoc);
playerDoc = new() { PlayerName = "Greg" };
playerDoc.AddColor("gold");
playerDoc.AddColor("ganja");
teamDoc.AddPlayer(playerDoc);
playerDoc = new() { PlayerName = "George" };
playerDoc.AddColor("gothBlack");
playerDoc.AddColor("gothamGreen");
teamDoc.AddPlayer(playerDoc);
TeamsCollection.InsertOne(teamDoc);
return TeamsCollection;
}
}
}
Team.cs:
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace UpdateSubDocument
{
public class Team
{
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } = ObjectId.GenerateNewId().ToString();
public required string TeamName { get; set; }
public required int TeamCode { get; set; }
public List
Players { get; set; } = [];
public void AddPlayer(Player player)
{
Players.Add(player);
}
}
}
Player.cs:
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace UpdateSubDocument
{
public class Player
{
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } = ObjectId.GenerateNewId().ToString();
public required string PlayerName { get; set; }
public List PlayerColors { get; set; } = [];
public void AddColor(string color)
{
PlayerColors.Add(color);
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79895560/mongodb-net-update-subdocument-using-id-string-with-arrayfilterdefinition[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия