繁体   English   中英

Mongoose 根据条件和特定日期之间获取文档的查询

[英]Mongoose query for fetching documents based on conditions and between certain dates

我有一个页面,其中列出了前端的所有学生数据。 目前我正在获取所有文档,而不管它们的 showStudentProfile 状态如何。 现在,我需要根据以下条件使用 Mongoose 查询从 mongoDB 获取所有学生。

状况:

  1. 如果showStudentProfile === hide && owner === userIduserId是登录用户),则获取学生列表。 也就是说,他应该只能获取他自己的隐藏文件。

2.如果showStudentProfile === custom ,则如果当前日期在dateRange字段之间,则仅获取那些文档。

  1. 如果showStudentProfile === yes ,则获取文档。

学生模式如下:

[{
  "_id": ObjectId("5f44af5a232afe415dc2bc01"),
    "name" : "abc",
    "sub" : ["math", "generalScience"],
    "showStudentProfile" : "yes",
    "dateRange" : [],
    "owner": ObjectId("5f44af5a232afe415dc2bc03"),
},{
  "_id": ObjectId("5f44af5a232afe415dc2bc04"),
  "name" : "def",
  "sub" : ["physics", "chemistry"],
  "showStudentProfile" : "hide",
  "dateRange" : [],
  "owner": ObjectId("5f44af5a232afe415dc2bc03"),
},{
  "_id": ObjectId("5f44af5a232afe415dc2bc05"),
  "name" : "ghi",
  "sub" : ["math", "science"],
  "showStudentProfile" : "custom",
  "dateRange" : [ 
    "2020-07-28T11:14:50.652Z", 
    "2020-08-28T11:14:50.652Z"
],
  "owner": ObjectId("5f44af5a232afe415dc2bc03"),
},{
  "_id": ObjectId("5f44af5a232afe415dc2bc07"),
  "name" : "xyz",
  "sub" : ["physics", "chemistry"],
  "showStudentProfile" : "hide",
  "dateRange" : [],
  "owner": ObjectId("5f44af5a232afe415dc2bc08"),
}]

我的尝试:

StudentModel.find({showStudentProfile:"hide", owner:"userId"})

但这只会获取那些showStudentProfile为 hide 且owneruserId的文档。 但我还需要获取showStudentProfilecustom的文档,如果custom并考虑到 currentDate,我需要获取落在dateRange字段之间的文档。

如果userId = ObjectId("5f44af5a232afe415dc2bc03")并考虑今天的日期,预期结果:

[{
  "_id": ObjectId("5f44af5a232afe415dc2bc01"),
    "name" : "abc",
    "sub" : ["math", "generalScience"],
    "showStudentProfile" : "yes",
    "dateRange" : [],
    "owner": ObjectId("5f44af5a232afe415dc2bc03"),
},{
  "_id": ObjectId("5f44af5a232afe415dc2bc04"),
  "name" : "def",
  "sub" : ["physics", "chemistry"],
  "showStudentProfile" : "hide",
  "dateRange" : [],
  "owner": ObjectId("5f44af5a232afe415dc2bc03"),
}];

你有三个条件,所以你可以从$match$or组合 db.collection.aggregate([

db.collection.aggregate([
  {
    $match: {
      $or: [
        {
          owner: ObjectId("5f44af5a232afe415dc2bc03"),
          showStudentProfile: "hide"
        },
        {
          showStudentProfile: "custom",
          $expr: {
            $and: [
              {
                $lt: [
                  {
                    $toDate: {
                      $arrayElemAt: [
                        "$dateRange",
                        0
                      ]
                    }
                  },
                  new Date()
                ]
              },
              {
                $gt: [
                  {
                    $toDate: {
                      $arrayElemAt: [
                        "$dateRange",
                        1
                      ]
                    }
                  },
                  new Date()
                ]
              }
            ]
          }
        },
        {
          showStudentProfile: "yes"
        }
      ]
    }
  }
])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM