В Mongoose, как найти документ на основе диапазона дат в поддокументе - PullRequest
0 голосов
/ 10 июля 2019

У меня есть файл 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 для запуска

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

...