Mongoose findoneandupdate возвращает обновленный документ, но не обновленный в базе данных - PullRequest
0 голосов
/ 03 июля 2018

Схема правильная, и эти поля должны обновляться. Итак, я получаю частичные данные из одного вызова API. И некоторые из другого. Который я отмечу ниже. Моя схема:

var coin = new Mongoose.Schema({
id: Number,
rank: Number,
source: String,
symbol: String,
name: String,
cap: String,
heat: Number,
circulating_supply: Number,
total_supply: Number,
max_supply: Number,
change: {
    hour: String,
    day: String
},
quotes: {
    USD: {
        price: Number,
        volume_24h: Number,
        market_cap: Number,
        percent_change_1h: Number,
        percent_change_7d: Number,
        percent_change_24h: Number
    },
    BTC: {
        price: Number,
        volume_24h: Number,
        market_cap: Number,
        percent_change_1h: Number,
        percent_change_7d: Number,
        percent_change_24h: Number
    },
    ETH: {
        price: Number,
        volume_24h: Number,
        market_cap: Number,
        percent_change_1h: Number,
        percent_change_7d: Number,
        percent_change_24h: Number
    }
},
high_low_24hr: {
    high: Number,
    high_time: Date,
    low: Number,
    low_time: Date
},
ath: {
    price_date: Date,
    price_usd: Number,
    price_btc: Number
},
month_high: {
    price_date: Date,
    price_usd: Number,
    price_btc: Number
},
month_low: {
    price_date: Date,
    price_usd: Number,
    price_btc: Number
},
last_updated: Number
});

Первый звонок выходит и получает эту информацию. Вот как выглядит объект в монго на данный момент:

{
"_id" : ObjectId("5b3548f7d78545f691195a9c"),
"quotes" : {
    "USD" : {
        "price" : 468.418,
        "volume_24h" : 1611470000,
        "market_cap" : 47058665940,
        "percent_change_1h" : -0.13,
        "percent_change_24h" : 0.07,
        "percent_change_7d" : 5.56
    }
},
"id" : 1027,
"name" : "Ethereum",
"symbol" : "ETH",
"rank" : 2,
"circulating_supply" : 100462975,
"total_supply" : 100462975,
"max_supply" : null,
"last_updated" : 1530638295
}

Второй звонок выходит и получает больше информации, в основном о максимумах и минимумах. Используя параметр {new: true} findOneAndUpdate, он возвращает обновленный документ. Возвращенный документ верен, но не тронут в базе данных:

{ quotes:
{ USD:
  { price: 476.498,
    volume_24h: 1633220000,
    market_cap: 47862549879,
    percent_change_1h: 0.86,
    percent_change_24h: 4.83,
    percent_change_7d: 3.48 } },
ath:
{ price_usd: 1376.74,
 price_btc: 0.09671,
 price_date: 2018-01-14T05:00:00.000Z },
month_high:
{ price_usd: 475.78,
 price_btc: 0.07182,
 price_date: 2018-07-03T04:00:00.000Z },
month_low:
{ price_usd: 452.24,
 price_btc: 0.07106,
 price_date: 2018-07-02T04:00:00.000Z },
_id: 5b3548f7d78545f691195a9c,
id: 1027,
name: 'Ethereum',
symbol: 'ETH',
rank: 2,
circulating_supply: 100446486,
total_supply: 100446486,
max_supply: null,
last_updated: 1530569111 }

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

По запросу, вот вызов findOneAndUpdate. Эта проблема исчезла, но я все равно решил опубликовать ее. Возможно, это можно улучшить.

let update_ath_cc = (response, source, app) => {
  var data = response.data;
  var query = {symbol: data.symbol};

  db.coinModel.findOneAndUpdate(query, data, {new:true}, function(err, newRecord){
    if(err){
      console.log("database lookup error: " + err);
    }

    if(newRecord){
      console.log(data.symbol + " ath updated.");
      return true;
    } else {
      console.log(data.symbol + " not found for ath update.");
    }
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...