pouchDB и запросы по дате или диапазону дат - PullRequest
0 голосов
/ 30 марта 2020

В настоящее время я могу успешно извлекать данные из своей базы данных, создать индекс и затем получить самые последние 7 записей, используя pouchDB в ответ. js прогрессивное веб-приложение.

Мое препятствие в настоящее время запрашивает по датам. Итак, с моим текущим кодом я получаю все данные, создаю индекс, а затем получаю только 7 последних записей, чтобы я мог отобразить данные. Но я пытаюсь понять, как использовать мою текущую дату для текущего дня: newestDate: moment(this.currentDate).format("YYYY-MM-DD") и использовать это, чтобы сказать «получить самую последнюю запись за каждый день за последние 7 дней»

Так эффективно , У меня есть записи в формате {caloriesBurned:"250", caloriesConsumed:"1450", createdAt:"2020-03-05"}, и я хочу иметь возможность изменять свой запрос, чтобы получать только одну запись за каждый день, начиная с сегодняшнего дня и возвращаясь на 7 дней

Как правильно сделать это в pouchDB с этим кодом:

fetchData = () => {
    this.setState({
        calorieElements: null,
    });
    this.state.caloriesDB.db.allDocs({
        include_docs: true,
    }).then(result => {
        const rows = result.rows;
        console.log('this is a row');
        console.log(result);
        this.setState({
            calorieElements: rows.map(row => row.doc),
        });
        console.log(this.state.calorieElements);
    }).catch((err) =>{
        console.log(err);
    });
  }

  getMax = () => {

    this.state.caloriesDB.db.createIndex({
      index: {
        fields: ['_id','caloriesBurned', 'createdAt']
      }
    }).then(result => {
      console.log(result);
      this.setMax();

   }).catch((err) =>{
      console.log(err);
    });
  }

  setMax = () => {
    this.state.caloriesDB.db.find({
      selector: {
        $and: [
          {_id: {"$gte": null}},
          {caloriesBurned: {$exists: true}},
          {caloriesConsumed: {$exists: true}},
          {createdAt: {$exists: true}}
        ]
      },
      fields: ['caloriesBurned','caloriesConsumed', 'createdAt'],
      sort: [{'_id':'desc'}],
      limit: 7
    }).then(result => {

      const newDocs = result.docs;
      const docCalories = newDocs.map(x => +x.caloriesConsumed - +x.caloriesBurned);

    }).catch((err) =>{
      console.log(err);
    });
  }

1 Ответ

1 голос
/ 08 апреля 2020

Вот пример того, как можно достичь желаемого. Я держал код как можно ближе к вашему. Ключом является порядок полей индекса, причем createdAt является первым для облегчения сортировки.

let db;
// demo 
initDb().then(() => {
  // get last 7 days on 2020-03-09
  return queryCreatedAt("2020-03-09", 7, 'desc');
}).then(result => {
  // display results.
  console.log(result);
})

// query docs by createdAt 
function queryCreatedAt(date, limit, order) {
  return db.find({
    selector: {
      $and: [{
          createdAt: {
            $lte: date
          }
        },
        {
          caloriesBurned: {
            $exists: true
          }
        },
        {
          caloriesConsumed: {
            $exists: true
          }
        }
      ]
    },
    sort: [{
      createdAt: order
    }],
    limit: limit,
    fields: [
      'createdAt',
      'caloriesBurned',
      'caloriesConsumed'
    ]
  });
}

// init db instance
function initDb() {

  db = new PouchDB('test', {
    adapter: 'memory'
  });

  return db.bulkDocs(getDocsToInstall()).then(() => {
    return db.createIndex({
      index: {
        fields: [
          'createdAt',
          'caloriesBurned',
          'caloriesConsumed'
        ]
      }
    })
  })
}

// get test docs
function getDocsToInstall() {
  return [{
      "caloriesBurned": "350",
      "caloriesConsumed": "1350",
      "createdAt": "2020-02-27"
    }, {
      "caloriesBurned": "350",
      "caloriesConsumed": "1350",
      "createdAt": "2020-02-28"
    }, {
      "caloriesBurned": "350",
      "caloriesConsumed": "1350",
      "createdAt": "2020-02-29"
    },
    {
      "caloriesBurned": "350",
      "caloriesConsumed": "1350",
      "createdAt": "2020-03-01"
    }, {
      "caloriesBurned": "350",
      "caloriesConsumed": "1350",
      "createdAt": "2020-03-02"
    },
    {
      "caloriesBurned": "950",
      "caloriesConsumed": "1950",
      "createdAt": "2020-03-03"
    },
    {
      "caloriesBurned": "350",
      "caloriesConsumed": "1350",
      "createdAt": "2020-03-04"
    },
    {
      "caloriesBurned": "350",
      "caloriesConsumed": "1350",
      "createdAt": "2020-03-05"
    },
    {
      "caloriesBurned": "350",
      "caloriesConsumed": "1350",
      "createdAt": "2020-03-06"
    },
    {
      "caloriesBurned": "450",
      "caloriesConsumed": "1450",
      "createdAt": "2020-03-07"
    },
    {
      "caloriesBurned": "550",
      "caloriesConsumed": "1550",
      "createdAt": "2020-03-08"
    }
  ]
}
<script src="//cdn.jsdelivr.net/npm/pouchdb@7.1.1/dist/pouchdb.min.js"></script>
<script src="https://github.com/pouchdb/pouchdb/releases/download/7.1.1/pouchdb.memory.min.js"></script>
<script src="https://github.com/pouchdb/pouchdb/releases/download/7.1.1/pouchdb.find.js"></script>

Для поддержки нескольких записей на одну и ту же дату я бы денормализовал отдельные документы, представленные в дневные (24-часовые) документы с записями в массиве, как это. Я предпочитаю использовать UT C вместо строковых дат - это личный выбор.

{
  entries: [
    {
      "caloriesBurned": "350",
      "caloriesConsumed": "1350",
      "createdAt": 1586357069
    },
    {
      "caloriesBurned": "450",
      "caloriesConsumed": "1450",
      "createdAt": 1586357080
    },
    {
      "caloriesBurned": "550",
      "caloriesConsumed": "1550",
      "createdAt": 1586357140
    }
  ]
}

Для получения дополнительной информации о том, как индексировать и запрашивать элементы в коллекции, см. Статью SO Индексирование и запрос элементов в массив с запросом man go для cloudant и couchdb 2.0

...