Я использую 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