Как использовать данные 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 из поля узлов.

Другие вопросы по тегам