可以进一步优化$ lookup流式聚合管道吗?

时间:2019-06-04 16:07:20

标签: c# mongodb mongodb-query aggregation-framework

我有两个实体集合AuthorBook。它们通过名为JoinAuthorBook的联接集合处于一对多关系,该联接集合具有两个字段ParentIDChildID。 ParentID存储作者的ID,ChildID具有书的ID。

我有一个函数,它通过执行两个$ lookup阶段来接收IAggregateFluent [Book]并返回IAggregateFluent [Author],以下是生成的聚合管道,该聚合管道被发送到mongodb。

我的问题是,您知道在相同的输入下获得相同最终结果的更有效方法吗?尤其是$ replaceRoot和$ arrayElemAt位置为0,这是最好的方法吗?

我还放置了生成流畅查询的C#代码。因此,如果您能提供使用强类型c#代码的解决方案,我将不胜感激,因为我将在c#驱动程序的局限下工作,并且我的代码库不能包含任何魔术字符串。

欢呼!

{
    "$match": {
        "_id": ObjectId("5cf68e18a8e892318888a63f")
    }
}, {
    "$lookup": {
        "from": "JoinAuthorBook",
        "localField": "_id",
        "foreignField": "ChildID",
        "as": "Results"
    }
}, {
    "$replaceRoot": {
        "newRoot": {
            "$arrayElemAt": ["$Results", NumberInt("0")]
        }
    }
}, {
    "$lookup": {
        "from": "Authors",
        "localField": "ParentID",
        "foreignField": "_id",
        "as": "Results"
    }
}, {
    "$replaceRoot": {
        "newRoot": {
            "$arrayElemAt": ["$Results", NumberInt("0")]
        }
    }
}

c#驱动程序代码:

public IAggregateFluent<TParent> GetParents<TParent, TChild>(IAggregateFluent<TChild> children)
{
  return children
         .Lookup<TChild, JoinRecord, Joined<JoinRecord>>(
            JoinCollection,
            c => c.ID,
            r => r.ChildID,
            j => j.Results)
         .ReplaceRoot(j => j.Results[0])
         .Lookup<JoinRecord, TParent, Joined<TParent>>(
            AuthorCollection,
            r => r.ParentID,
            p => p.ID,
            j => j.Results)
         .ReplaceRoot(j => j.Results[0]);
}
public class Joined<T> : JoinRecord
{
    public T[] Results { get; set; }
}
public class JoinRecord : Entity
{
    public string ParentID { get; set; }
    public string ChildID { get; set; }
}

0 个答案:

没有答案