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 相同的元素。
我有一个 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 相同的元素。