Драйвер NodeJS MongoDB: укажите тип поля при вставке

#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 и явно укажите типы.

Для принудительного применения типов на стороне сервера используйте проверку схемы.