Как выполнить запрос внутри массива в mongodb - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть база данных в понедельник go. Мне нужно найти все образцы за определенное время.

[
  {
    deviceid: 1,
    bucketSize: 4,
    first: 1573833152,
    last: 1573833155,
    samples: [
      {
        val: 10,
        time: 1573833152
      },
      {
        val: 15,
        time: 1573833153
      },
      {
        val: 14,
        time: 1573833154
      },
      {
        val: 20,
        time: 1573833155
      }
    ]
  },
  {
    deviceid: 1,
    bucketSize: 4,
    first: 1573833156,
    last: 1573833160,
    samples: [
      {
        val: 10,
        time: 1573833156
      },
      {
        val: 15,
        time: 1573833157
      },
      {
        val: 14,
        time: 1573833158
      },
      {
        val: 20,
        time: 1573833159
      },
      {
        val: 20,
        time: 1573833160
      }
    ]
  },
  {
    deviceid: 1,
    bucketSize: 4,
    first: 1573833161,
    last: 1573833165,
    samples: [
      {
        val: 10,
        time: 1573833161
      },
      {
        val: 15,
        time: 1573833162
      },
      {
        val: 14,
        time: 1573833163
      },
      {
        val: 20,
        time: 1573833164
      }
    ]
  }
]

Например: образцы между 1573833152 и 1573833156

должны дать

samples: [
      {
        val: 10,
        time: 1573833152
      },
{
        val: 15,
        time: 1573833153
      },
   {
        val: 14,
        time: 1573833154
      },
      {
        val: 20,
        time: 1573833155
      },      {
        val: 10,
        time: 1573833156
      }

Я перепробовал все методы, но не удалось извлечь требуемые результаты. Большое спасибо заранее. Я пытался использовать $ или, $ elemMatch. Но так как я новичок в Пн go, я потерпел неудачу. Если кто-то может помочь, пожалуйста

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Для этого вам нужно будет использовать агрегирование.

  • Сначала сопоставьте метки времени с массивом samples, чтобы вы рассматривали только те документы, которые содержат хотя бы один образец, который вас интересует
  • размотка samples, поэтому каждый документ содержит только 1 образец
  • , чтобы снова сопоставить временные метки, чтобы исключить посторонние образцы
  • сортировать по отметке времени, при желании
  • сгруппировать по _null, помещая каждый образец в массив
db.collection.aggregate([
    {$match: { "samples.time": { $gte: 1573833152, $lte: 1573833156 }}},
    {$unwind: "$samples"},
    {$match: { "samples.time": { $gte: 1573833152, $lte: 1573833156 }}},
    {$sort: { "samples.time": 1}},
    {$group: { _id:null, samples:{$push:"$samples"}}}
])

Playground

0 голосов
/ 18 апреля 2020

Попробуйте это:

 samples.find({
     $elemMatch: {
         $gte: 1573833152,
         $lte: 1573833156
     }
 })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...