Пн goose - Приращение очень большого числа - PullRequest
0 голосов
/ 08 мая 2020

Я хочу сохранить очень большое число 16 di git в моей базе данных, как показано ниже:

{ "_id" : ObjectId("5eb550aae41d233f1058efb0"), "id" : 1, "referenceId" : 100000000000000000, "__v" : 0 }
и увеличить его значение на 1. Но по какой-то причине число у меня сохраненные в db не увеличиваются.
Вот что я сделал:

    return new Promise((resolve, reject) => {
    // Incrementing the only document in 'referenceIds' collection by 1
    ReferenceId.findOneAndUpdate(
        { id: 1 },
        { $inc: { referenceId: 1 } }
    ).then(res => {
        // If no document found, creating new one.(This is a one time activity)
        if (!res) {
            let referenceIdDoc = new ReferenceId({
                id: 1,
                referenceId: 100000000000000000
            })
            referenceIdDoc.save()
                .then(res => {
                    resolve(res.referenceId);
                })
                .catch(err => {
                    reject(err);
                });
        } else {
            resolve(res.referenceId);
        }
    }).catch(err => {
        reject(err);
    });
});  

Но ссылка, которая сохраняется в db, выглядит следующим образом:

{
"_id" : ObjectId("5eb554cb80a31d3670afddcb"),
"id" : 1,
"referenceId" : 1e+17,
"__v" : 0
}  

И после увеличения 'referenceId' в приведенном выше фрагменте кода, 'referenceId' остается прежним. т.е. 100000000000000000.

Как я могу сохранять и увеличивать очень большие целые числа, такие как 100000000000000000, в mongodb, используя NodeJs и Mon goose?

Кто-нибудь может мне помочь Вот? Я застрял в этом вопросе несколько часов. Любая помощь будет оценена. Спасибо

ОБНОВЛЕНИЕ:

Я использовал модуль mon goose -long npm для работы с очень большими целыми числами и сделал следующее изменения в моем приложении:

const mongoose = require("mongoose");
require('mongoose-long')(mongoose);

let SchemaTypes = mongoose.Schema.Types;

const ReferenceId = mongoose.Schema({
  id: {
    type: Number,
    required: true
  },
referenceId: {
    type: SchemaTypes.Long,
    required: true
}
})

module.exports = mongoose.model("ReferenceId", ReferenceId);

. Значение увеличивается, как и ожидалось. Как показано ниже:

{
"_id" : ObjectId("5eb55c2d83d44f1f2864ff86"),
"id" : 1,
"referenceId" : NumberLong(100000000000000005),
"__v" : 0
}  

Однако в моем приложении NodeJs я не получаю фактическое значение 'referenceId'. Я получаю следующий объект:

{_bsontype: "Long", low_: 1569325061, high_: 23283064}  

Кто-нибудь может сказать мне, как я могу получить фактическое значение из db?

1 Ответ

1 голос
/ 08 мая 2020

Вы можете использовать пакет [mongoose-long][1] npm при работе с mon goose. Вы можете получить значение в своей переменной. Добавьте 1, а затем обновите объект mon goose. Сообщите мне, работает ли это для вас.

var mongoose = require("mongoose");
let Schema = mongoose.Schema;
require("mongoose-long")(mongoose);
mongoose.connect("mongodb://localhost/appsyoda", { useNewUrlParser: true });

var db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error:"));
db.once("open", function() {
    // we're connected!
    console.log("connected");
});

var SchemaTypes = mongoose.Schema.Types;
var partSchema = new Schema({ someLong: SchemaTypes.Long });

var Part = db.model("Part", partSchema);

var part = new Part({ someLong: "100000000000000005" });

var Long = mongoose.Types.Long;
part.someLong = part.someLong.add(Long.fromString("1"));
console.log(part.someLong.toString());
part.save();
console.log("part " + part.someLong);

Суть кода - функция .toString () класса Long. Проверьте http://mongodb.github.io/node-mongodb-native/api-bson-generated/long.html эту ссылку для получения подробной информации.

...