簡體   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