#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
Примечание: проверьте несколько сценариев, хотя он работает для этого сценария