MongoDB найти строку внутри подполя

#mongodb

#mongodb

Вопрос:

Допустим, у нас есть коллекция, в которой элементы выглядят следующим образом:

 {
"_id" : ObjectId(...),
"field1": "some_text",
"field2": {
                "subfield1" : [
                        "some_text",
                        "some_text",
                        "some_text"
                ],
                "subfield2" : [
                        "some_text",
                        "some_text"
                ],
                "subfield3" : [
                        "some_text"
                ]
        }
}
  

Теперь я хочу найти все идентификаторы, которые имеют определенную строку внутри значения field2. Не имеет значения, в каком подполе. Если там есть такая строка, я хочу, чтобы был возвращен весь этот элемент. Представьте, что существует 100 подполей. Я не хочу проверять каждый из них отдельно.

Как это можно сделать?

Ответ №1:

Используйте это, чтобы поместить все значения в один массив. Тогда легко найти конкретную строку в subfields массиве.

 db.collection.aggregate([
  {
    $set: {
      subfields: { $objectToArray: [ "$field2" ] }
    }
  },
  {
    $set: {
      subfields: {
        $reduce: {
          input: { $concatArrays: [ "$subfields.v" ] },
          initialValue: [],
          in: { $concatArrays: [ "$$value", "$$this" ] }
        }
      }
    }
  },
  {$match: {subfields: "whatever you are looking for"}},
  {$unset: "subfields"}
])
  

Комментарии:

1. Не могли бы вы объяснить, как это работает? Похоже, в моем случае это ничего не возвращает

2. Пропустите последний $unset (и, возможно, даже $match ) этап, тогда вы должны его распознать. В противном случае предоставьте более реалистичный образец документа и желаемое условие.

3. Да, это работает. Большое спасибо! Хотя, как бы вы написали сопоставление с подобным параметром?