【问题标题】:How to $lookup with MongoDB C# driver?如何使用 MongoDB C# 驱动程序进行 $lookup?
【发布时间】:2016-02-25 21:08:19
【问题描述】:

如何使用 MongoDB C# 驱动程序执行 $lookup?我在他们的驱动程序文档中找不到它:

https://docs.mongodb.org/getting-started/csharp/query/

但如果我在他们的JIRA中正确理解了这张票,它应该是在2.2版本的驱动中:

https://jira.mongodb.org/browse/CSHARP-1374

【问题讨论】:

  • 我猜您指的是缺少的“帮助程序”方法,这是因为大多数驱动程序实现此类功能落后于新服务器版本的功能,因此只能预料到这种情况。与普通查询一样,聚合管道实际上只是 BSON 结构。只要有效,您可以构建为 BSON 文档的任何内容都可以作为输入提供给 .find().aggregate()。因此,只需将管道直接构建为 BSON 文档即可。当然,只要你有一个 MongoDB 3.2 服务器来支持$lookup。这是最重要的因素。
  • 请注意,这里有比Aggregate $lookup with C# 显示的更完整的示例。显示所有 Queryable 表单以及驱动程序的 Fluent Builders。

标签: c# mongodb mongodb-.net-driver


【解决方案1】:

您也可以使用collection.Aggregate().Lookup() 方法或通过将查找添加到聚合阶段来实现。

collection.Aggregate()
    .Lookup("foreignCollectionName", "localFieldName", "foreignFieldName", "result");

【讨论】:

【解决方案2】:

如果您在 IMongoCollection 上使用 AsQueryable() 扩展方法,则可以使用 LINQ 接口作为示例。

var query = from p in collection.AsQueryable()
            join o in otherCollection on p.Name equals o.Key into joined
            select new { p.Name, AgeSum: joined.Sum(x => x.Age) };

这是从这里的 mongodb csharp 驱动程序文档中复制的 http://mongodb.github.io/mongo-csharp-driver/2.2/reference/driver/crud/linq/#lookup

【讨论】:

  • otherCollection 是什么类型?
  • 你需要 using MongoDB.Driver.Linq; 命名空间来完成这项工作
  • @tigrou System.Linq 对我来说已经足够了
【解决方案3】:

这对我有用:

var collection2 = database.GetCollection<BsonDocument>("dbACESSO");

var match1 = new BsonDocument("$match", new BsonDocument("PartnerId", cliente));
var match2 = new BsonDocument("$match", new BsonDocument("CD_CLIENTE", codCond));

var lookup1 = new BsonDocument { { "$lookup", new BsonDocument { { "from", "GRUPO_UNIDADE" }, { "localField", "CD_GRUPO_UNIDADE" }, { "foreignField", "CD_GRUPO_UNIDADE" }, { "as", "GRUPO" } } } };

var pipeline = new[] { match1, match2, lookup1 };
var result = collection2.Aggregate<BsonDocument>(pipeline).ToList();

【讨论】:

    【解决方案4】:

    问题是查找需要投影

    Collection.Aggregate().Lookup("foreignCollectionName", "localFieldName", "foreignFieldName","result").Project(Builders<BsonDocument>.Projection.Exclude("_id"))
    .ToList()
    

    那么你需要它来转换成 JSON

    String ConvertToJson= res[0].AsBsonDocument.ToJson();
    String resultsConvertToJson = ConvertToJson.ToJson();
    

    然后使用 BSONSerialize 并将其放入 C# 强类型集合中

    List<TModel> results= BsonSerializer.Deserialize<List<TMModel>>(resultsConvertToJson);
    

    【讨论】:

    • 你能解释一下我们是否可以直接从你那里得到结果吗?第一部分?无需转换为 json
    【解决方案5】:

    除了那些家伙已经提到的之外,您可以使用查找方法的类型安全重载。

    Lookup 是本地集合的扩展方法,接受 4 个参数,第一个是外部集合,第二个是本地字段的表达式,第三是外部字段的表达式,第四个是将连接结果映射到输出类型中的字段。

    _fromTypeCollection.Aggregate<fromType>()
    .Lookup<fromType,targetType,outputType>(targetTypeCollection,
    fromType => fromType.localFeild, 
    targetType => targetType.foreignField, 
    outputType => outputType.result);
    

    【讨论】:

      猜你喜欢
      • 2020-06-21
      • 2020-11-26
      • 2018-06-19
      • 2018-08-27
      • 2012-08-18
      • 1970-01-01
      • 2019-03-01
      • 2018-05-01
      • 1970-01-01
      相关资源
      最近更新 更多