#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"
, и т.д.