Пн go поиск округления даты - PullRequest
1 голос
/ 19 марта 2020

Я новичок, использующий Mongo. Мне нужно встроить один или несколько документов в другой документ, где ключ для поиска - ISODate, который должен быть округлен до второго. Как мне достичь этого результата?

А что, если я должен выполнить поиск более чем на одной клавише, скажем, DtEvent и WorkstationId?

Это примерный набор данных:

temperature коллекция:

{
    "WorkstationId" : 1,
    "DtEvent" : ISODate("2020-01-01T00:00:10.723Z"),
    "ParameterName" : "temperature",
    "ParameterValue" : 232.1
}
{
    "WorkstationId" : 1,
    "DtEvent" : ISODate("2020-01-01T00:00:56.622Z"),
    "ParameterName" : "temperature",
    "ParameterValue" : 231.9
}

pressure коллекция:

{
    "WorkstationId" : 1,
    "DtEvent" : ISODate("2020-01-01T00:00:10.725Z"),
    "ParameterName" : "pressure",
    "ParameterValue" : 3276.69
}
{
    "WorkstationId" : 1,
    "DtEvent" : ISODate("2020-01-01T00:00:56.641Z"),
    "ParameterName" : "pressure",
    "ParameterValue" : 3276.69
}
{
    "WorkstationId" : 1,
    "DtEvent" : ISODate("2020-01-01T00:01:42.622Z"),
    "ParameterName" : "pressure",
    "ParameterValue" : 3276.69
}

Я пытался сделать следующее:

db.pressure.aggregate([{    
    $lookup: {
        from: "temperature",
        localField: "DtEvent",
        foreignField: "DtEvent",
        as: "temperature"        
    }
}])

Но, как и ожидалось, документ не внедрен, поскольку ключ не совсем совпадает:

/* 1 */
{
    "_id" : ObjectId("5e738e151cc1692a9ace9b8c"),
    "WorkstationId" : 1,
    "DtEvent" : ISODate("2020-01-01T00:00:10.725Z"),
    "ParameterName" : "pressure",
    "ParameterValue" : 3276.69,
    "temperature" : []
}

/* 2 */
{
    "_id" : ObjectId("5e738e151cc1692a9ace9b8f"),
    "WorkstationId" : 1,
    "DtEvent" : ISODate("2020-01-01T00:00:56.641Z"),
    "ParameterName" : "pressure",
    "ParameterValue" : 3276.69,
    "temperature" : []
}

/* 3 */
{
    "_id" : ObjectId("5e738e151cc1692a9ace9b92"),
    "WorkstationId" : 1,
    "DtEvent" : ISODate("2020-01-01T00:01:42.622Z"),
    "ParameterName" : "pressure",
    "ParameterValue" : 3276.69,
    "temperature" : []
}

1 Ответ

1 голос
/ 19 марта 2020

Classi c $lookup ожидает точное совпадение . Поскольку ваши Dates не являются точными значениями, вам нужно выполнить некоррелированный подзапрос

db.pressure.aggregate([
  {
    $lookup: {
      from: "temperature",
      let: {
        dt_event: {
          $dateToString: {
            date: "$DtEvent",
            format: "%Y-%m-%dT%H:%M:%S"
          }
        }
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$$dt_event",
                {
                  $dateToString: {
                    date: "$DtEvent",
                    format: "%Y-%m-%dT%H:%M:%S"
                  }
                }
              ]
            }
          }
        }
      ],
      as: "temperature"
    }
  }
])

MongoPlayground

Примечание: MongoDB не будет использовать индексы, поэтому он будет иметь низкую производительность для большой коллекции

...