gpt4 book ai didi

c# - 使用 C# 更新 mongodb 中的嵌入式文档

转载 作者:可可西里 更新时间:2023-11-01 10:44:46 25 4
gpt4 key购买 nike

假设你有下一节课。它包含代理工作过的系统

public class AgentHistory
{
public ObjectId Id { get; set; }
public Guid SystemId { get; set; }
public Guid CampaignId { get; set; }
public List<Agent> Agents { get; set; }
}

现在,当我得到一个新代理时,我会做下一件事:

 public override AgentHistory Save(AgentHistory agent)
{
if (agent == null)
throw new ArgumentNullException("agent");
if (_repository.Exists(agent))
{
AgentHistory dbEntity = _repository.FindById(agent.SystemId, agent.CampaignId);
dbEntity.Agents.AddRange(agent.Agents);
_repository.UpdateAgentHistory(dbEntity);
}
else
{
_repository.Save(agent);
}
return agent;
}

存储库中的下一个方法:

public void UpdateAgentHistory(AgentHistory updatedEntity)
{
QueryComplete query = Query.EQ("_id", BsonValue.Create(updatedEntity.Id));

MongoCollection.Update(query, Update.Set("Agents", BsonArray.Create(updatedEntity.Agents)), UpdateFlags.None, SafeMode.True );
}

我得到下一个异常.NET 类型 Riverdale.Domain.BO.Agent 无法映射到 BsonValue。我做错了什么?更新嵌入式集合的正确方法是什么?

这是一个更简单的控制台应用程序,它会抛出(仅作为演示):

  public class Agent
{
[BsonId]
public string LocalIdentifier { get; set; }

public string AgentName { get; set; }
}

public class A
{
public ObjectId Id { get; set; }
public Guid SystemId { get; set; }
public Guid CampaignId { get; set; }
public Agent[] Agents { get; set; }
}

public class AgentHistoryRepository
{
public bool Exists(A agentHistory)
{
return _mongoCollection.FindOne(BuildIdentityQuery(agentHistory)) != null;
}

public void Delete(A agentHistory)
{
_mongoCollection.Remove(BuildIdentityQuery(agentHistory));
}

public List<string> GetAgentsForASystem(Guid systemGuid)
{
QueryComplete query = Query.EQ("SystemId", systemGuid);
return _mongoCollection.Find(query).SelectMany(x => x.Agents.Select(z => z.AgentName)).Distinct().ToList();
}

public List<string> GetAgentsForACampaign(Guid systemGuid, Guid campaignGuid)
{
QueryComplete query = Query.EQ("CampaignId", campaignGuid);
if (systemGuid != Guid.Empty)
query = Query.And(new[] {query, Query.EQ("SystemId", systemGuid)});
return _mongoCollection.Find(query).SelectMany(x => x.Agents.Select(z => z.AgentName)).Distinct().ToList();
}

public AgentHistoryRepository()
{
string connectionString = "mongodb://localhost/Sample";
var mgsb = new MongoUrlBuilder(connectionString);
var MongoServer = MongoDB.Driver.MongoServer.Create(mgsb.ToMongoUrl());
var MongoDatabase = MongoServer.GetDatabase(mgsb.DatabaseName);
_mongoCollection = MongoDatabase.GetCollection<A>("AgentHistory");
}


private MongoCollection<A> _mongoCollection;

private QueryComplete BuildIdentityQuery(A agentHistory)
{
QueryComplete query = Query.And(Query.EQ("SystemId", agentHistory.SystemId),
Query.EQ("CampaignId", agentHistory.CampaignId));
return query;
}

public void Save(A entity)
{
_mongoCollection.Insert(entity, SafeMode.True);
}

public void UpdateAgents(A entity)
{
_mongoCollection.Update(BuildIdentityQuery(entity), Update.Set("Agents", entity.Agents.ToBsonDocument()));
}
}

internal class Program
{
public static void Main()
{

var objectToSave = new A {Id = ObjectId.GenerateNewId(), CampaignId=Guid.NewGuid(), SystemId =Guid.NewGuid() ,
Agents = new [] {new Agent{LocalIdentifier="agent", AgentName= "name"}}};

var repo = new AgentHistoryRepository();
repo.UpdateAgents(objectToSave);
objectToSave.Agents = new[] { new Agent { LocalIdentifier = "agent2", AgentName = "name2" } };
repo.UpdateAgents(objectToSave);
var objectToSave2 = new A
{
Id = ObjectId.GenerateNewId(),
CampaignId = Guid.NewGuid(),
SystemId = objectToSave.SystemId,
Agents = new [] { new Agent { LocalIdentifier = "agent", AgentName = "name" } }
};
repo.UpdateAgents(objectToSave2);
foreach (var agentName in repo.GetAgentsForASystem(objectToSave.SystemId))
Console.WriteLine(agentName);
}
}

最佳答案

您不必如此冗长:BsonValue.Create()BsonArray.Create 不应该是必需的。

事实上,后者是导致问题的原因:BsonArray.Create 创建值类型数组。但是,您需要一个对象数组。如果您查看 BsonArray.Create 的可用重载,我猜您将调用 BsonArray.Create(IEnumerable),这是不可取的。

你试过简单地使用

MongoCollection.Update(query, Update.Set("Agents", updatedEntity.Agents), ...);

代替?

在 JSON 中,差异如下所示:

Array of Values: [ val, val, ... ]

Array of Objects: [ { ... }, { ... }, ... ]

例如,

简单数组:[ "mongodb", "awesomne​​ss", ... ]

对象数组:[ { userId: 2314234, comment: "Foo"}, { ... }, ... ]

关于c# - 使用 C# 更新 mongodb 中的嵌入式文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8092552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com