【问题标题】:Date query in nested schema in MongoDB/Mongoose returning result out of rangeMongoDB / Mongoose中嵌套模式中的日期查询返回结果超出范围
【发布时间】:2018-09-14 19:46:08
【问题描述】:

我在查询中遇到了这个奇怪的结果:

我的架构:

var taskSchema = new mongoose.Schema({
    name: String,
    done: Boolean,
    dueDate: Date,
    info: String
});

var eventSchema = new mongoose.Schema({
        tasks:     [ taskSchema ],
}, { usePushEach: true });

我在 Robo 3T 中的查询:

db.getCollection('events').find({ 'tasks.dueDate': 
    {
        $gte: new ISODate('2018-04-01T00:00:00'),
        $lte: new ISODate('2018-05-01T00:00:00')
    }
}, { 'tasks.$': 1, _id: 1 }

)

哪些结果:

 /* 1 */
{
    "_id" : ObjectId("59fabc5ec85c3400123cdf5b"),
    "tasks" : [ 
        {
            "name" : "Comprar champagne",
            "dueDate" : ISODate("2019-01-31T06:00:00.000Z"),
            "_id" : ObjectId("5a723e868dba4f0014c0c556"),
            "done" : true
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5a1c99ccba7cc60014c99945"),
    "tasks" : [ 
        {
            "name" : "Prova do vestido",
            "dueDate" : ISODate("2018-05-10T03:00:00.000Z"),
            "_id" : ObjectId("5a7336d5b882bc0014daeba9"),
            "done" : false
        }
    ]
}

如您所见,它返回了一份包含 2019 年 task.dueDate 的文档,超出了查询范围。 为什么会这样?

MongoDB 版本 v3.6.3

提前致谢! 感谢您的宝贵时间!

【问题讨论】:

标签: mongodb mongoose


【解决方案1】:

试试这个查询:

db.events.find(
 {tasks:{$elemMatch:{$and:[{dueDate:{$lte: new Date('2018-05-01T00:00:00')}}, 
 {dueDate:{$gte: new Date('2018-04-01T00:00:00')}}]} }     
 }, { 'tasks.$': 1, _id: 1 }
)

输出是:

{
"_id" : ObjectId("5a1c99ccba7cc60014c99945"),
"tasks" : [ 
    {
        "name" : "Degustaçao buffet",
        "dueDate" : ISODate("2018-04-02T03:00:00.000Z"),
        "_id" : ObjectId("5a7337abb882bc0014daebaa"),
        "done" : false
    }
  ]
}

【讨论】:

  • 非常感谢!这效果更好,但我需要在日期范围内找到任何数组文档(示例中的任务)。我有这个文档:textsaver.flap.tv/lists/1wj4 在该范围内有两个任务: db.events.find( {tasks: { $elemMatch: { $and: [ {dueDate:{$lte: new Date('2018-06-01T00 :00:00')}}, {dueDate:{$gte: new Date('2018-04-01T00:00:00')}} ]} } }, { 'tasks.$': 1, _id: 1 } ) 但在这种情况下,它只返回一个文档。
  • 其实这是另一个问题。我正在检查您的答案是否正确。谢谢@Rahul Raj!
猜你喜欢
  • 1970-01-01
  • 2020-03-28
  • 2017-06-23
  • 2021-01-02
  • 1970-01-01
  • 2016-09-26
  • 2017-03-01
  • 2021-07-22
  • 1970-01-01
相关资源
最近更新 更多