#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. Да, это работает. Большое спасибо! Хотя, как бы вы написали сопоставление с подобным параметром?