在猫鼬中,如何根据子文档中的日期范围找到文档

时间:2019-07-10 18:08:21

标签: node.js mongodb mongoose aggregation-framework subdocument

我有一个使用mongoose和mongo的node.js api和一个已经存在的数据库。我需要添加基于子文档日期范围进行查询的功能。我可以使用Robo3T使聚合查询在MongoDB中工作,但无法在nodejs / mongoose中使相同查询工作。

请注意,尽管我没有在代码段中显示它,但是它必须位于聚合管道中,因为它正在与其他值连接。

我已经使用Robo3T和以下版本在MongoDB中使用它

db.getCollection('sample').aggregate([
    {
        $match: {
            chronology:{
                $elemMatch: {
                    timestamp: { $gte: new Date('2018-10-30') },
                    state: 2
                }
            }
        }
    }
    ]);

在猫鼬里面,我尝试过直接使用日期字符串,将其转换为日期,然后使用该方法,将日期转换为ISOString,将日期转换为时间戳,并以字符串'new Date(“ '+ date +'“)'或仅日期或ISODate或新的ISODate,所有这些都始终返回0个结果而没有错误(并且在Mongo中,我得到结果,因此该范围内的文档)。

尽管它不是我想要的,但我也尝试放松,因为它重复了根文档

年代学是子文档的数组,时间戳是日期,状态是Int32

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才能运行

我希望看到结果,而是返回一个空数组,并且控制台中没有错误

0 个答案:

没有答案