Почему метод find не работает в Mongoose?

Существует несколько способов сделать это.

Первый из них - Операторы агрегирования даты , которые позволяют вам анализировать значения «даты» в документах. В частности, для «группировки» в качестве основного намерения:

db.collection.aggregate([
  { "$group": {
    "_id": {
      "year": { "$year": "$created_at" },
      "dayOfYear": { "$dayOfYear": "$created_at" },
      "hour": { "$hour": "$created_at" },
      "interval": {
        "$subtract": [ 
          { "$minute": "$created_at" },
          { "$mod": [{ "$minute": "$created_at"}, 15] }
        ]
      }
    }},
    "count": { "$sum": 1 }
  }}
])

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

db.collection.aggregate([
    { "$group": {
        "_id": {
            "$subtract": [
                { "$subtract": [ "$created_at", new Date("1970-01-01") ] },
                { "$mod": [ 
                    { "$subtract": [ "$created_at", new Date("1970-01-01") ] },
                    1000 * 60 * 15
                ]}
            ]
        },
        "count": { "$sum": 1 }
    }}
])

. Это зависит от того, какой формат вывода вы хотите для интервала группировки. Оба они в основном представляют одно и то же и имеют достаточные данные для повторной конструкции в качестве объекта «даты» в вашем коде.

Вы можете поместить все что угодно в разделе «оператор группировки» после группировки _id. Я просто использую основной пример «подсчета» вместо любого реального заявления от себя относительно того, что вы действительно хотите сделать.


MongoDB 4.x и Upwards

Были некоторые дополнения к операторам агрегирования даты с момента написания оригинала, но из MongoDB 4.0 будет фактическое «реальное литье типов» в отличие от основных математических приемов, сделанных здесь с преобразованием даты BSON.

Для Например, мы можем использовать $toLong и $toDate в качестве новых помощников:

db.collection.aggregate([
  { "$group": {
    "_id": {
      "$toDate": {
        "$subtract": [
          { "$toLong": "$created_at" },
          { "$mod": [ { "$toLong": "$created_at" }, 1000 * 60 * 15 ] }
        ]
      }
    },
    "count": { "$sum": 1 }
  }}
])

Это немного короче и не требует определения внешняя BSON Дата для значения «epoch» как константа при определении конвейера, поэтому она вполне согласуется для всех языковых реализаций.

Это всего лишь два из «вспомогательных» методов преобразования типов, которые все привязываются к метод $convert , который является «более длинной» формой реализации, позволяющей выполнять пользовательскую обработку на null или ошибку в преобразовании.

Это возможно даже при таком литье получить информацию о Date из ObjectId первичного ключа, так как это было бы надежным источником даты создания:

db.collection.aggregate([
  { "$group": {
    "_id": {
      "$toDate": {
        "$subtract": [
          { "$toLong": { "$toDate": "$_id" }  },
          { "$mod": [ { "$toLong": { "$toDate": "_id" } }, 1000 * 60 * 15 ] }
        ]
      }
    },
    "count": { "$sum": 1 }
  }}
])

Таким образом, «типы литья» с таким преобразованием могут быть довольно мощным инструментом.

0
задан bradrar 4 March 2019 в 08:55
поделиться

1 ответ

Я почти уверен, что .find() работает правильно, но не находит ни одного документа в базе данных с такими критериями запроса. Обратите внимание, что в коде маршрута вы запрашиваете { category: 'travel', permalink: 'why-travel-to-el-nido' }, т. Е. Соответствующий документ блога должен иметь поля category: 'travel' И permalink: 'why-travel-to-el-nido', но когда вы смотрите на Mongo, используя db.blogs.find({category: "travel"}).pretty(), вы [ 1115] только ищет документы блога, которые имеют {category: "travel"}, но не имеют ограничений для поля permalink.

Пожалуйста, повторите поиск в Mongo, используя db.blogs.find({category: "travel", permalink: "why-travel-to-el-nido"}).pretty(), чтобы смоделировать тот же запрос из маршрута, и посмотрите, сможете ли вы найти какой-либо документ, который соответствует этим критериям.

Я предполагаю, что вы не найдете ничего, поэтому mongoose .find() возвращает пустой массив, что означает «нет совпадений».

Редактировать: Я только что видел комментарий от Нила Ланна , и, возможно, конфигурация мангуста не указывает на нужную базу данных. Следуйте его инструкциям, чтобы убедиться, что вы запрашиваете нужную коллекцию.

0
ответ дан Carlos Gutiérrez 4 March 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: