我有一个mongodb集合(文档), 对于每个文档(doc1),我想查找所有其他文档(doc2) doc2.LinexText [any]。带有doc1.ID的单词的交集不为空。
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:'不支持的过滤器: 任何({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驱动程序执行此交集?
答案 0 :(得分:0)
您可以通过构建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();
这将检查是否有任何单词包含与mongoDoc相同的元素。