我有两个实体集合Author
和Book
。它们通过名为JoinAuthorBook
的联接集合处于一对多关系,该联接集合具有两个字段ParentID
和ChildID
。 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; }
}