Как использовать данные Spring Mongo для запроса на основе позиции элемента в массиве
У меня есть "тест" коллекции монго, который содержит такие элементы (с массивом узлов, который имеет установленный и значимый порядок):
"test" : {
"superiorID" : 1,
"nodes" : [
{
"subID" : 2
},
{
"subID" : 1
},
{
"subID" : 3
}
]
}
или же
"test" : {
"superiorID" : 4,
"nodes" : [
{
"subID" : 2
},
{
"subID" : 1
},
{
"subID" : 3
}
]
}
Я использую Spring Criteria, чтобы попытаться создать монго-запрос, который вернет мне все элементы, где ' subID ' равен пользовательскому идентификатору ввода ' inputID ', а позиция ' superiorID ' НЕ предшествует ' inputID ' (если старший идентификатор есть даже в идентификаторах, которые не требуются).
Так, например, если бы мой пользовательский ввод был равен 3, я бы НЕ хотел извлекать первый документ, но я бы захотел извлечь второй документ (первый имеет вышестоящий элемент, существующий в узлах ДО ДО того, как вышестоящий идентификатор узла userInput второго не равен пользовательский ввод).
Я знаю, что функция $indexOfArray существует, но я не знаю, как перевести это в критерии.
2 ответа
Вы можете получить искомый результат с помощью структуры агрегации. Я сделал специальный запрос для вас, чтобы показать, что вы должны искать. Это возвращает showMe = false для doc1 и showMe = true для doc2, которые вы могли бы явно согласовать. Вам не нужны 2 этапа проекта для этого запроса, я только сделал это, чтобы сделать рабочий запрос, который также легко читается. Это не будет очень быстрый запрос. Если вам нужны быстрые запросы, вы можете переосмыслить структуру данных.
db.getCollection('test').aggregate([
{ "$project":
{
"superiorIndex": {"$indexOfArray" : [ "$nodes.subID","$superiorID" ]},
"inputIndex": {"$indexOfArray" : [ "$nodes.subID",3 ]},
}
},
{ "$project":
{
"showMe" :
{
$cond:
{
if: { $eq: [ "$superiorIndex", -1 ] },
then: true,
else: {$gt:[ "$superiorIndex","$inputIndex"]}
}
}
}
}
])
db.collection.find({node.2.subID:2}), который запрос будет искать 2-й элемент subid из поля узлов.