Вот пример того, как можно достичь желаемого. Я держал код как можно ближе к вашему. Ключом является порядок полей индекса, причем 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