使用C#更新Mongodb中的嵌入式文档假设你有下一堂课。它包含代理运行的系统publicclassAgentHistory{publicObjectIdId{get;放;}publicGuidSystemId{得到;放;}publicGuidCampaignId{get;放;}publicListAgents{get;放;现在,当我得到一个新代理时,我会做下一件事:如果(_repository.Exists(agent)){AgentHistorydbEntity=_repository.FindById(agent.SystemId,agent.CampaignId);dbEntity.Agents.AddRange(agent.Agents);_repository.UpdateAgentHistory(dbEntity);}else{_repository.Save(agent);}返回代理;}和存储库中的下一个方法:MongoCollection.Update(query,Update.Set("Agents",BsonArray.Create(updatedEntity.Agents)),UpdateFlags.None,SafeMode.True);我得到下一个异常。NET类型Riverdale.Domain.BO.Agent无法映射到BsonValue。我究竟做错了什么?更新嵌入式集合的正确方法是什么?这是一个更简单的控制台应用程序抛出(如演示):publicclassAgent{[BsonId]publicstringLocalIdentifier{get;放;}publicstringAgentName{get;放;}}publicclassA{public}publicGuidSystemId{get;放;}publicGuidCampaignId{get;放;}publicAgent[]Agents{get;放;}}publicclassAgentHistoryRepository{publicboolExists(AagentHistory){return_mongoCollection.FindOne(BuildIdentityQuery(agentHistory))!=null;}publicvoidDelete(AagentHistory){_mongoCollection.Remove(BuildIdentityQuery(agentHistory));}publicListGetAgentsForASystem(GuidsystemGuid){QueryCompletequery="Query.EQ(SystemId",systemGuid);返回_mongoCollection.Find(query).SelectMany(x=>x.Agents.Select(z=>z.AgentName)).Distinct().ToList();}publicListGetAgentsForACampaign(GuidsystemGuid,GuidcampaignGuid){QueryCompletequery=Query.EQ("CampaignId",campaignGuid);如果(systemGuid!=Guid。空)query=Query.And(new[]{query,Query.EQ("SystemId",systemGuid)});返回_mongoCollection.Find(query).SelectMany(x=>x.Agents.Select(z=>z.AgentName)).Distinct().ToList();}publicAgentHistoryRepository(){stringconnectionString="mongodb://localhost/Sample";varmgsb=newMongoUrlBuilder(connectionString);varMongoServer=MongoDB.Driver.MongoServer.Create(mgsb.ToMongoUrl());varMongoDatabase=MongoServer.GetDatabase(mgsb.DatabaseName);_mongoCollection=MongoDatabase.GetCollection("AgentHistory");}私有MongoCollection_mongoCollection;privateQueryCompleteBuildIdentityQuery(AagentHistory){QueryCompletequery=Query.And(Query.EQ("SystemId",agentHistory.SystemId),Query.EQ("CampaignId",agentHistory.CampaignId));返回查询;}publicvoidSave(Aentity){_mongoCollection.Insert(entity,SafeMode.True);}publicvoidUpdateAgents(Aentity){_mongoCollection.Update(BuildIdentityQuery(entity),Update.Set("Agents",entity.Agents.ToBsonDocument()));}}内部类程序{publicstaticvoidMain(){varobjectToSave=newA{Id=ObjectId.GenerateNewId(),CampaignId=Guid.NewGuid(),SystemId=Guid.NewGuid(),Agents=new[]{newAgent{LocalIdentifier="agent",AgentName="name"}}};varrepo=newAgentHistoryRepository();repo.UpdateAgents(objectToSave);objectToSave.Agents=new[]{新代理{LocalIdentifier="agent2",AgentName="name2"}};repo.UpdateAgents(objectToSave);varobjectToSave2=newA{Id=ObjectId.GenerateNewId(),CampaignId=Guid.NewGuid(),SystemId=objectToSave.SystemId,Agents=new[]{newAgent{LocalIdentifier="agent",AgentName="name"}}};repo.UpdateAgents(objectToSave2);foreach(varagentNameinrepo.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中,区别如下:Arrayofvalues:[val,val,…]Arrayofobjects:[{…},{…},…]比如简单数组:["mongodb","awesomne??ss",...]对象数组:[{userId:2314234,comment:"Foo"},{...},...]以上是C#学习教程:使用C#更新内嵌文档分享的全部内容在mongodb中。大家有用,需要多了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
