фильтрация запросов mongodb по вычисленному составному полю в диапазоне

#mongodb

#mongodb

Вопрос:

Скажем, коллекция имеет такую структуру, как

 {
  "_id": ObjectId("5fd8825285e55e381e278b30"), 
  "name": "some name",
  "ts" : {
    "seconds" : NumberLong(1608024657), "nanos" : 519000000
  }
}
 

Как отфильтровать для некоторых ((ts.seconds * 1000,000,000) ts.nanos) < 1234567890123456 ?

Фильтр запроса должен быть из некоторых полей, вычисленных до значения, и фильтровать по этому значению.

Ответ №1:

Используйте операторы $sum и $multiply для выполнения арифметических операций:

 db.yourCollection.find({
    $expr: { $lt: [ {
        $sum: [ { $multiply: ["$ts.seconds", 1000000000] }, "$ts.nanos"]
    }, 1234567890123456] }
});
 

Комментарии:

1. Не работает, ошибка: MongoDB server version: 4.4.2 uncaught exception: ReferenceError: ts is not defined : ...

2. @Michaelzh извиняется… имена полей должны быть в двойных кавычках. Пожалуйста, попробуйте еще раз.

3. Не работает: ошибка: MongoDB server version: 4.4.2 Error: error: { "ok" : 0, "errmsg" : "Failed to optimize expression :: caused by :: $multiply only supports numeric types, not string", "code" : 16555, ....}

4. Используйте "$ts.seconds" "$ts.nanos" , и т.д.