Mongodb .NET 驱动程序嵌套数组与数组值相交

Mongodb .NET Driver Nested Array Intersect with Array Value

我有一个 mongodb 集合(文档), 对于每个文档 (doc1) ,我想找到所有其他文档 (doc2) 其中 doc2.LinexText[any] 的交集。与 doc1.IDs 的单词不为空。

doc {
    "IDs": ["ID1", "ID2"],
    "LineText": [{
        "Words": ["W1", "W2"]
    }]
}

public class MongoDocument : Entity
{       
        public List<string> IDs{ get; set; } = new List<string>();
        public List<LineText> Lines { get; set; } = new List<LineText>();

}

public class LineText
{          
      public List<string> Words { get; set; } = new List<string>();
}

我的第一次尝试是使用下面的过滤器,但它不起作用(不支持的过滤器异常)

var filter = Builders<MongoDocument>.Filter.And(Builders<MongoDocument>.Filter.ElemMatch(x => x.LinesText, x => x.Words.Intersect(mongoDoc.IDs).Any());

我遇到了这个异常:

System.ArgumentException: 'Unsupported filter: Any({document}{Words}.Intersect(value(System.Collections.Generic.List`1[System.String]))).'

所以现在,我只匹配第一个 ID,直到我弄清楚如何匹配列表中的任何 ID。

var filter = Builders<MongoDocument>.Filter.And(Builders<MongoDocument>.Filter.ElemMatch(x => x.LinesText, x => x.Words.Contains(mongoDoc.IDs[0]));

如何使用 MongoDB .NET 驱动程序执行此交集?

您可以通过构建一个 AnyIn 过滤器来表示像这样的相交来做到这一点

   var intersectFilter = Builders<LineText>.Filter.AnyIn(x => x.Words, mongoDoc.IDs);
   var combinedFilter = Builders<MongoDocument>.Filter.ElemMatch(x => x.Lines, intersectFilter);
   var items = collection.Find(combinedFilter).ToList();

这将检查是否有任何 Word 包含与 mongoDoc 相同的元素。