MongoDB .NET Обновите вложенный документ, используя строку идентификатора с ArrayFilterDefinitionC#

Место общения программистов C#
Ответить
Anonymous
 MongoDB .NET Обновите вложенный документ, используя строку идентификатора с ArrayFilterDefinition

Сообщение 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);
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... definition
Ответить

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

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

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

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

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