代码之家  ›  专栏  ›  技术社区  ›  vibhor1997a

在mongodb中将字符串转换为日期?

  •  2
  • vibhor1997a  · 技术社区  · 8 年前

    我在用 find 为了得到结果,我正在申请 Array.prototype.filter 在javascript中过滤格式为2个给定日期字符串之间的日期 dd-mm-yyyy .

    let query = {};
    req.query.query && (query.name = new RegExp(req.query.query, 'i'));
    req.query.gender && (query.gender = new RegExp(`^${req.query.gender}$`, 'i'));
    Student.find(query, { roll: 1, name: 1, _id: 0, email: 1, DOB: 1, gender: 1 }, (err, students) => {
        if (err) {
            next(err);
        }
        else {
            if (req.query.DOB_from && req.query.DOB_to) {
                let from = toDate(req.query.DOB_from);
                let to = toDate(req.query.DOB_to)
                res.send(filterBetweenDates(students, from, to));
            }
            else {
                res.send(students)
            }
        }
    });
    
    
    /**
     * Returns time val in mil secs from a date string in Indian format i.e dd-mm-yyyy
     * @param {string} dateStr 
     */
    function toDate(dateStr) {
        let a = dateStr.split('-').map(Number);
        let d = new Date(a[2], a[1] - 1, a[0]);
        return d.getTime();
    }
    
    /**
     * Filters the result which matches the date
     * @param {Student1[]} students resultant students array
     * @param {Number} from time val in millisecs(from)
     * @param {Number} to time val in millisecs(from)
     */
    function filterBetweenDates(students, from, to) {
        return students.filter(({ DOB }) => {
            return (from <= toDate(DOB)) && (to >= toDate(DOB));
        });
    }
    

    我面临的问题是日期不确定 年月日 格式保存为 string 而且输入的格式与字符串相同。因此,我首先应用其他查询,然后根据日期进行过滤。在查询本身中有什么方法可以做到这一点吗?

    编辑:

    样本采集

        [
        {
            "name": "vib",
            "roll": 413,
            "email": "abc@example.com",
            "DOB": "25-07-1997",
            "gender": "Male"
        }
        {
            "name":"abc",
            "roll":123,
            "email": "abc@xyz.com",
            "DOB": "07-11-2000",
            "gender": "Female"
        }
    ]
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   Ashh    8 年前

    你可以用 $dateFromString 更改字符串的聚合 DOB 去约会然后你就可以 $match 日期和用于更改用户日期格式的 moment 利比亚

    db.collection.aggregate([
      {
        "$addFields": {
          "date": {
            "$dateFromString": {
              "dateString": "$DOB"
            }
          }
        }
      },
      { "$match": { "date": { "$lte": date, "$gte": date }}}
    ])