Драйвер Mongodb .NET для вложенного массива пересекается со значением массива - PullRequest
0 голосов
/ 10 июня 2019

У меня есть коллекции mongodb (документы), для каждого документа (doc1) я хочу найти все остальные документы (doc2) где пересечение doc2.LinexText [any] .Words с 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: 'Неподдерживаемый фильтр: Любой ({документ} {} Слова .Intersect (значение (System.Collections.Generic.List`1 [System.String]))).

так что сейчас я сопоставляю только первый идентификатор, пока не выясню, как сопоставить любой идентификатор в списке.

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

как я могу выполнить это пересечение с помощью драйвера MongoDB .NET?

1 Ответ

0 голосов
/ 11 июня 2019

Вы можете сделать это, построив фильтр 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.

...