#node.js #mongodb
#node.js #mongodb
Вопрос:
Как я могу указать или, другими словами, применить определенный тип при вставке документа? Например,
{
a: 1,
b: 2
},
{
a: 1.5,
b: 1.5
}
и я хотел бы определить для MongoDB, чтобы в этом случае все поля были двойными. Это потому, что в JavaScript нет такого понятия, как целое число, все целые числа по умолчанию удваиваются, хотя десятичная точка исчезает, когда десятичной точки нет. Такое поведение фактически вызывает проблему при вставке документов в MongoDB из NodeJS, поскольку оно слабо типизировано.
Я хотел бы подчеркнуть, что я не большой поклонник Mongoose и, пожалуйста, не предлагайте мне использовать это! Я хочу знать, как явно указывать типы при вставке с использованием оригинального драйвера MongoDB.
Ответ №1:
вы можете использовать
var { Double } = require("mongodb");
const item = {
a: Double(1),
b: Double(2)
}
Комментарии:
1. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и более высокого качества и, скорее всего, привлекут больше голосов.
2. Отличный ответ! @MarkRotteveel: Его / ее ответ кристально ясен!
3. @ArnoldZahrneinder Идея не в том, чтобы дать кому-то рыбу, а вместо этого научить их ловить рыбу.
4. @MarkRotteveel: Я думаю, это то, что он сделал, потому что, когда дело доходит до математики и компьютерного программирования, вы учитесь на примерах, а не на теории. Вы знаете, картинка (вот пример) говорит тысячу слов. И у меня более 25 лет опыта в программировании (C ), я не из тех, кто просто копирует и вставляет.
Ответ №2:
Даже если Javascript использует double по умолчанию для всех чисел, драйвер Javascript MongoDB — это заноза в заднице, и он решил использовать 32-разрядные типы int по умолчанию для чисел, которые являются целыми числами, и double для всего остального. Таким образом, вы получите типы в БД, которые могут показаться случайными. Единственный способ, который я нашел, чтобы исправить это, — это определить любое число как mongodb.Double()
явно, что действительно неудобно:
import * as mongodb from 'mongodb';
const obj = { a: new mongodb.Double(0) };
// Now you can save it to the DB and obj.a will be a double instead of a 32-bit integer
// If you need to convert it back to a number to operate with it:
console.log(obj.a.valueOf() 1);
Это заполнит вашу кодовую базу вызовами new mongodb.Double()
и .valueOf()
, и MongoDB, Inc., похоже, не заботится об этом!
Ответ №3:
Используйте js-bson и явно укажите типы.
Для принудительного применения типов на стороне сервера используйте проверку схемы.