Nano Hash - криптовалюты, майнинг, программирование

MongoDB: OrderBy определенного поля в массиве

У меня есть такая структура документа:

{
  "_id": ObjectId("4ed3733abde68a21780000a0"),
  [HERE OTHER DATA...]
  "myArray": [
    {
      "name": "myName1",
      "value": 4
    },
    {
      "name": "myName2",
      "value": "myValue"
    },
    {
      "name": "myName3",
      "value": 14.6
    }
  ]
}

Я хочу сделать запрос документов, упорядоченных по определенному полю в массиве "myArray".

Пример: я хочу запросить документы, упорядоченные по myArray[name="myName1"].value

Если myArray[name="myName1"] не существует, он должен быть в конце списка результатов.

Если myArray[name="myName1"] существует в документе два раза, возможно, выберите первый.

Является ли это возможным ?

11.09.2015

Ответы:


1

Вы можете упорядочить по массиву «индекс», как правило, с сортировкой:

db.collection.find().sort({ "myArray.0.value": 1 })

Но если вы действительно хотите отсортировать по совпадающему «имени», вам нужно будет сделать это вместо этого:

db.collection.aggregate([
    { "$project": {
       "field": 1,
       "anotherField": 1,
       "myArray": 1,
       "sortField": { 
           "$setDifference": [
               { "$map": {
                   "input": "$myArray",
                   "as": "el",
                   "in": {
                       "$cond": [
                           { "$eq": [ "$$el.name", "myName1" ] },
                           "$$el.value",
                           false
                       ]
                   }
               }},
               [false]
           ]
       }
   }},
   { "$sort": { "sortField": 1 } }
])

Который по существу «отфильтровывает» значение поля, которое вы хотите использовать, где оно соответствует, а затем позволяет использовать это новое спроецированное поле (все еще фактически массив, хотя и один элемент или, возможно, ни один) для сортировки.

См. также $project и другие операторы агрегирования для их использования.

Обратите внимание, что если ваше "имя" для сопоставления не существует в массиве, то результаты могут быть не такими, как вы хотите.

Но вы не можете «просто указать имя» для прямого соответствия .sort(), так как это просто не работает. Отсюда и более длинная конструкция, чтобы это произошло.

11.09.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..