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

问题描述 投票:1回答:1

我正在使用下面的查询来获取所有必需的文档,然后应用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();

我想将上述LINQ查询与现有查找查询合并。

任何想法如何通过查找实现?

c# mongodb lookup aggregation mongodb-.net-driver
1个回答
0
投票

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

{
    $match: {
        $expr: {
            $or: [
                { $ne: [ "$Replicated.lastReplicationStatus", "success" ] },
                { $ne: [ "$Replicated.eSeq", "$Replicated.lastReplicationSequence" ] },
            ]
        }
    }
}

在C#中如下所示:

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();
© www.soinside.com 2019 - 2024. All rights reserved.