Запрос документов, в которых совпадают смежные элементы массива

#mongodb

#mongodb

Вопрос:

У меня есть коллекция MongoDB с документами в следующем формате:

     { "_id" : 1, "tokens": [ "I", "have", "a", "dream" ] },
    { "_id" : 2, "tokens": [ "dream", "a", "little", "dream" ] },
    { "_id" : 3, "tokens": [ "dream", "a", "dream" ] },
    { "_id" : 4, "tokens": [ "a" , "little", "dream" ] },
    ...
 

Мне нужно получить все документы, «токены» которых включают смежные элементы массива: «a», «dream».
Итак, следующие совпадающие документы:

     { "_id" : 1, "tokens": [ "I", "have", "a", "dream" ] },
    { "_id" : 3, "tokens": [ "dream", "a", "dream" ] },
 

Есть ли способ получить правильные результаты?

Ответ №1:

Хитрость заключается в том, чтобы иметь регулярное выражение.

  • $match чтобы получить все документы, в которых есть $all ввод массива
  • $addFields чтобы иметь дубликат токенов и входного массива
  • $reduce помогает объединить все соединения строк -
  • $regexMatch для сопоставления обеих строк
  • $match для устранения нежелательных данных
  • $project чтобы получить только необходимые поля

Код

 [{
    $match: {
        tokens: { $all: ["a", "dream"] }
    }
}, {
    $addFields: {
        duplicate: "$tokens",
        inputData: ["a", "dream"]
    }
}, {
    $addFields: {
        duplicate: {
            $reduce: {
                input: "$duplicate",
                initialValue: "",
                in: { $concat: ["$value", "-", "$this"] }
            }
        },
        inputData: {
            $reduce: {
                input: "$inputData",
                initialValue: "",
                in: { $concat: ["$value", "-", "$this"] }
            }
        }
    }
}, {
    $addFields: {
        match: {
            $regexMatch: { input: "$duplicate", regex: '$inputData' }
        }
    }
}, {
    $match: {
        match: true
    }
}, {
    $project: {  _id: 1,  tokens: 1 }
}]
 

Рабочая игровая площадка Mongo

Примечание: проверьте несколько сценариев, хотя он работает для этого сценария