C# MongoDB-将文档引用作为嵌套文档返回

C# MongoDB-将文档引用作为嵌套文档返回,c#,mongodb,nested,C#,Mongodb,Nested,想象一下这个结构: 收藏公司: { "company" : "foo", "city" : "1234" } { "company" : "bar", "city" : "1234" } 收集城市: { "_id" : "1234", "cityname" : "Berlin", "zipcode" : "09123" } 现在我想在查询company=“foo”时得到结果: 如何从C#驱动程序中查询此信息?我的结果结构是C#类,我希望它是强类型的 像这样:

想象一下这个结构:

收藏公司:

{ 
  "company" : "foo",
  "city" : "1234"
}

{ 
  "company" : "bar",
  "city" : "1234"
}
收集城市:

{
  "_id" : "1234",
  "cityname" : "Berlin",
  "zipcode" : "09123"
}
现在我想在查询company=“foo”时得到结果:

如何从C#驱动程序中查询此信息?我的结果结构是C#类,我希望它是强类型的

像这样:

MongoCollection<Company> mc = mongodb.GetCollection<Company>("companies")
你应该明白这一点。
Mongo数据中心对此没有说太多。

您经常通过引用方式询问城市数据,嵌入此文档可以加快查询速度

重新构造文档架构,并将城市(地址)文档嵌入到公司文档中

{ company : "Deutsche Bank", address : { street : "Müllerstraße", number : "34a", zipcode : "13353", city : "Berlin" } } { 公司:“德意志银行”, 地址:{ 街道:“米勒斯特拉街”, 编号:“34a”, zipcode:“13353”, 城市:“柏林” } } 如果由于任何业务逻辑依赖于公司文档而没有其他选项,则可以选择创建聚合查询并作为结果投影新文档

[其他信息]

您必须运行一个额外的查询来获取引用的文档、访问每家公司并嵌入城市信息。

您的问题没有说明为什么您会期望“foo”的结果以及为什么它包含“bar”的值。除非你解释清楚,否则你不可能得到你想要的答案。我已经扩展了问题并修正了错误。仍然不确定你在问什么。MongoDB确实允许您在一个集合中存储“您想要的”,但您似乎在使用spring数据之类的东西,当然不会。虽然在一个集合中可能存在真正的混合数据,但通常这不是一个好主意,除非您真正谈论的是“多态”关联。但是同一个集合中的父/子让人们很难理解你的观点。因此,可能需要更多的“扩展”,或者重新思考一下刚才再次编辑的问题。我会把城市和公司放在不同的收藏中。它更多的是为多个文档提供一个重复的、相等的嵌套文档,但只在db上存储一次,并在db内部引用它。但是查询它就像它是一个嵌套的连接一样,所以基本上你是在寻找关系连接,但却选择了MongoDB作为你的解决方案。网上常见的阅读:“MongoDB不做连接”。您可能需要更多地考虑下一次编辑。你真的需要解释你自己。我只是想给你一些建议。MongoDB的存在填补了关系SQL数据库无法填补的空白。不是一个替代品。我之所以要改变文档模式,基本上是因为协同效应和性能。回到城市层面,我希望有1000家公司嵌入相同的城市文档。因此,我认为我可以在数据库中保存一些空间,只需将城市放在db中一次,并在内部引用它,但将结果作为嵌入文档。这就是为什么我将城市属性扩展为address属性,以便在其中存储更多信息,而不仅仅是城市名称和zipcode。你必须在城市中使用foreach来解决这个问题。这里的结构只是一个例子。这更多的是关于如何在mongo中高效地执行此类对等嵌套文档的一般方法。虽然这只是一个示例,但这是一个典型的MongoDB关系方法的好示例。就像尼尔说的。MongoDB中没有直接关系,与SQL中的关系不同。这是一种与SQL完全不同的方法。就像MongoDB在文档中描述的那样:最好将一个文档嵌入到1000个文档中,并通过一个查询来解决这个问题,比如db.companys.find({company:foo})
public class Company {
     public string company {get;set;}
     public City city {get;set;}
}
{ company : "Deutsche Bank", address : { street : "Müllerstraße", number : "34a", zipcode : "13353", city : "Berlin" } }