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

时间:2019-06-10 18:12:12

标签: mongodb mongodb-.net-driver

我有一个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驱动程序执行此交集?

1 个答案:

答案 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相同的元素。