Создайте фильтр In для поля массива Mongodb, используя c# - PullRequest
1 голос
/ 01 апреля 2020

У меня есть объект, похожий на тот, что показан ниже в C#. Я хотел бы найти подходящие объекты персонажа, которые содержат элемент, соответствующий указанному type, и этот элемент sourceId также присутствует в массиве предоставленных sourceIds:

Person: {
  id: 1,
  items: [
    {
      type: "one",
      sourceId: 2
    },
    {
      type: "two"
      sourceId: 3
    }
  ]
}

Пока я пришел с этим:

var filter = Builders<Person>.Filter.In(p => p.items.Where(i => i.type == "one").FirstOrDefault().sourceId, providedIds);
var results = PersonCollection.FindAsync(filter);

При запуске я получаю эту ошибку:

Невозможно определить информацию сериализации для p => p.items.Where (i => (i.type == "one")). FirstOrDefault (). sourceId

Из того, что я смог найти, кажется, что драйвер Mon go не понимает FirstOrDefault (или, возможно, где также). Как я могу выполнить sh этот запрос?

1 Ответ

2 голосов
/ 01 апреля 2020

MongoDB. NET Драйвер не может интерпретировать ваш фильтр и перевести его на язык запросов MongoDB.

Вместо этого вы должны использовать $ elemMatch , и фильтр может выглядеть следующим образом :

{ "items" : { "$elemMatch" : { "type" : "one", "sourceId" : { "$in" : [1, 2, 3] } } } }

C# версия:

var filter = Builders<Person>.Filter.ElemMatch(f => f.items,
            item => item.type == "one" && providedIds.Contains(item.sourceId));

, которая генерирует точно такой же оператор $elemMatch, который я вставил выше

...