如何使用MongoDB C#驱动程序聚合$lookup?

如何使用MongoDB C#驱动程序聚合$lookup?,c#,mongodb,lookup,aggregation,mongodb-.net-driver,C#,Mongodb,Lookup,Aggregation,Mongodb .net Driver,我正在使用下面的查找来获取所有必需的文档,然后应用LINQ查询来查找特定的文档&它工作正常 new BsonDocument("$lookup", new BsonDocument() .Add("from", "JournalInstructionReplication") .Add("localField", "_id") .Add("fo

我正在使用下面的查找来获取所有必需的文档,然后应用LINQ查询来查找特定的文档&它工作正常

     new BsonDocument("$lookup", new BsonDocument()
                        .Add("from", "JournalInstructionReplication")
                        .Add("localField", "_id")
                        .Add("foreignField", "_eid")
                        .Add("as", "Replicated"))
 var cursor = await collection.AggregateAsync(pipeline, options);
            List<BsonDocument> list = cursor.ToList();

           var failedDocs = list.Where(d => d["Replicated"][0]["lastReplicationStatus"] != "success" ||
                             d["Replicated"][0]["eSeq"] != d["Replicated"][0]["lastReplicationSequence"])
                            .ToList();
newbsondocument($lookup),newbsondocument()
.Add(“from”、“JournalInstructionReplication”)
.Add(“localField”,“_id”)
.Add(“foreignField”和“_eid”)
.添加(“作为”、“复制”))
var cursor=await collection.AggregateAsync(管道、选项);
List=cursor.ToList();
var failedDocs=list。其中(d=>d[“已复制”][0][“lastReplicationStatus”]!=“成功”||
d[“已复制”][0][“eSeq”]!=d[“已复制”][0][“上次复制序列”])
.ToList();
我想将上面的LINQ查询与现有的查找查询合并


您知道如何实现查找吗?

为了避免运行
[0]
,您可以运行
$unwind
,因为加入的集合之间存在明显的1:1关系(您通过
\u id
加入它们)。内存中的部分必须转换为以下内容:

在C#中看起来如下所示:


非常感谢。按预期工作。最终工作代码如下:

 new BsonDocument("$lookup", new BsonDocument()
                        .Add("from", "JournalInstructionReplication")
                        .Add("localField", "_id")
                        .Add("foreignField", "_eid")
                        .Add("as", "Replicated")),
                 new BsonDocument("$unwind", new BsonDocument()
                        .Add("path", "$Replicated")),
                   new BsonDocument("$match", new BsonDocument()
                        .Add("$expr", new BsonDocument()
                                .Add("$or", new BsonArray()
                                        .Add(new BsonDocument()
                                                .Add("$ne", new BsonArray()
                                                        .Add("$Replicated.lastReplicationStatus")
                                                        .Add("success")
                                                )
                                        )
                                        .Add(new BsonDocument()
                                                .Add("$ne", new BsonArray()
                                                        .Add("$Replicated.eSeq")
                                                        .Add("$Replicated.lastReplicationSequence")
                                                )
                                        )
                                )
                        ))
            };

            var cursor = await collection.AggregateAsync(pipeline, options);
            List<BsonDocument> list = cursor.ToList();
newbsondocument($lookup),newbsondocument()
.Add(“from”、“JournalInstructionReplication”)
.Add(“localField”,“_id”)
.Add(“foreignField”和“_eid”)
.添加(“作为”、“复制”),
新的BsonDocument($unwind),新的BsonDocument()
.Add(“路径“,“$Replicated”),
新的BsonDocument($match),新的BsonDocument()
.Add(“$expr”,新的BsonDocument()
.添加(“$or”,新的BsonArray()
.Add(新的BsonDocument()
.Add(“$ne”,新的BsonArray()
.Add(“$Replicated.lastplicationstatus”)
.Add.(“成功”)
)
)
.Add(新的BsonDocument()
.Add(“$ne”,新的BsonArray()
.Add(“$Replicated.eSeq”)
.Add(“$Replicated.lastplicationsequence”)
)
)
)
))
};
var cursor=await collection.AggregateAsync(管道、选项);
List=cursor.ToList();

您可以像这样消除所有的B文档噪音:谢谢您分享。让我查一查。
var q = _channels.Aggregate()
                    .Lookup(
                    foreignCollectionName: "JournalInstructionReplication", 
                    localField: "_id", 
                    foreignField:"_id", 
                    @as: "Replicated")
    .Unwind("Replicated")
    .Match(new BsonDocument()
    {
        { "$expr", new BsonDocument()
        {
            { "$or", new BsonArray()
            {
                new BsonDocument(){{ "$ne", new BsonArray(){ "$Replicated.lastReplicationStatus", "success" } }},
                new BsonDocument(){{ "$ne", new BsonArray(){ "$Replicated.eSeq", "$Replicated.lastReplicationSequence" } }
            } }
        } }
    }});

var result = q.ToList();
 new BsonDocument("$lookup", new BsonDocument()
                        .Add("from", "JournalInstructionReplication")
                        .Add("localField", "_id")
                        .Add("foreignField", "_eid")
                        .Add("as", "Replicated")),
                 new BsonDocument("$unwind", new BsonDocument()
                        .Add("path", "$Replicated")),
                   new BsonDocument("$match", new BsonDocument()
                        .Add("$expr", new BsonDocument()
                                .Add("$or", new BsonArray()
                                        .Add(new BsonDocument()
                                                .Add("$ne", new BsonArray()
                                                        .Add("$Replicated.lastReplicationStatus")
                                                        .Add("success")
                                                )
                                        )
                                        .Add(new BsonDocument()
                                                .Add("$ne", new BsonArray()
                                                        .Add("$Replicated.eSeq")
                                                        .Add("$Replicated.lastReplicationSequence")
                                                )
                                        )
                                )
                        ))
            };

            var cursor = await collection.AggregateAsync(pipeline, options);
            List<BsonDocument> list = cursor.ToList();