我有一个使用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才能运行
我希望看到结果,而是返回一个空数组,并且控制台中没有错误