У меня есть файл node.js api, использующий mongoose, mongo и уже существующую базу данных.Мне нужно добавить возможность запроса на основе диапазона дат поддокумента.Я могу заставить запрос агрегации работать в MongoDB, используя Robo3T, но не могу заставить тот же запрос работать в nodejs / mongoose.
Обратите внимание, что, хотя я не показываю его в фрагментах кода, он должен быть вконвейер агрегации, поскольку он соединяется с другими значениями.
Я получил его для работы в MongoDB, используя Robo3T и следующие
db.getCollection('sample').aggregate([
{
$match: {
chronology:{
$elemMatch: {
timestamp: { $gte: new Date('2018-10-30') },
state: 2
}
}
}
}
]);
Внутри mongoose, которую я пробовал, используя строку датынепосредственно, конвертируя ее в дату и используя ее, конвертируя дату в строку ISOS, конвертируя дату в метку времени и передавая в виде строки «новая дата (« + дата + ») или просто дата или ISODate илиновый ISODate, который всегда возвращает 0 результатов без ошибок (и в Mongo я получаю результаты, так что в этом диапазоне есть документы IS).
Я также попытался отмотать, несмотря на то, что это не то, что я хочу, поскольку он дублирует корневые документы
Хронология - это массив вложенных документов, отметка времени - Дата, а состояние - Int32
* 1013.* MCVE
var mongoose = require('mongoose');
var MongoMemoryServer = require('mongodb-memory-server-core').MongoMemoryServer;
var Schema = mongoose.Schema;
var chronologySchema = new Schema({
timestamp: {type: Date, default: Date.now(), required: true},
state: {type: Number, required: true, default: 0},
},{_id: false});
var sampleSchema = new Schema({
text: {type: String, required: true, default: ''},
chronology: {type: [chronologySchema], required: true, default: []},
});
var model = mongoose.model('sample', sampleSchema);
var db = {};
db.init = async function(){
const mongod = new MongoMemoryServer();
const uri = await mongod.getConnectionString();
// const port = await mongod.getPort();
// const dbPath = await mongod.getDbPath();
// const dbName = await mongod.getDbName();
mongoose.connect(uri, {
useNewUrlParser: true
});
db.Sample = model
var s = new db.Sample();
s.text = "Hello1";
var c = {
timestamp: "2019-07-11",
state: 1
};
var c2 = {
timestamp: "2018-07-11",
state: 2
};
s.chronology = [c, c2];
s.save(function(err, result){
var q = {};
q.chronology = {
$elemMatch: {
timestamp: { $gte: new Date('2019-07-10') },
state: 2
}
};
db.Sample.aggregate([
{
$match: q
},
]).exec(function(e, r){
console.log(e, r);
process.exit();
});
});
};
db.init();
Требуются mongoose и mongodb-memory-server для запуска
Я ожидаю увидеть результаты, вместо этого я получаю пустой массив без ошибок в консоли