【问题标题】:Convert Date to String in nested array in mongodb在mongodb的嵌套数组中将日期转换为字符串
【发布时间】:2020-05-04 06:57:51
【问题描述】:

我有一个名为 case 的 mongodb 集合,在内部案例中,每个公司对象都有一个案例数组。

所以结构是:

在每种情况下,我都想使用 createddate(它是一个字符串)和 endDate(也是字符串)并将其转换为 mongodb 日期。

当我使用 NoSQLBooster 时,我添加了以下查询:

db.cases.aggregate([
{ $match: { companyID: 218 }},
{ $unwind: "$cases" },
{ $match: { 'cases.id': '299' }},
{ $addFields: { 'cases.created':  new Date('2010-06-21T00:00:00.000'), 'cases.closed': new Date('2014-08-29T00:00:00.000') }},
{ $group: { _id: "$_id", cases: { $push: "$cases" }}}])

这将在一个新字段中添加一个日期 - 创建然后关闭。这正是我想要的。

但是,在我的代码中(使用猫鼬),我有以下内容:

scripts.commponent.ts:

runThroughCasesAndConvertDates(id) {
    this.scriptsService.getAllCasesToModify({ companyID : id}).subscribe( res => {
      if (res.length > 0) {
        for (let i = 0; i < res[0].cases.length; i++) {
          const caseID = res[0].cases[i].id;
          const data = {
            companyID: id,
            caseID: caseID,
            created: moment(res[0].cases[i].createddate, 'DD-MMM-YYYY h:mm a').format('YYYY-MM-DD[T00:00:00.000Z]'),
            closed: ''
          };
          if (res[0].cases[i].endDate !== '') {
             data.closed = moment(res[0].cases[i].endDate, 'DD-MMM-YYYY h:mm a').format('YYYY-MM-DD[T00:00:00.000Z]');
           }
          this.scriptsService.updateDates(data).subscribe();
        }
      }
    });
  }

scripts.service.ts

updateDates(body) {
    return this.http.post('/db/cases/updateAllDates', body).pipe(
      map(res => res.json())
    );
  }

casesDB.js

    router.post('/updateAllDates', (req, res) => {
  const { body } = req;
Cases.aggregate([
    { $match: { companyID: body.companyID }},
    { $unwind: "$cases" },
    { $match: { 'cases.id': body.caseID }},
    { $addFields: { 'cases.created':  new Date(body.created), 'cases.closed': new Date(body.closed) } },
    { $group: { _id: "$_id" }
  }],
  function (err, data) {
    res.json(data)
   });
});

但它不会向数组中添加任何内容。我真的很困惑我做错了什么。也许有更好的方法/方法来做到这一点?

谢谢

【问题讨论】:

    标签: javascript mongodb mongodb-query aggregation-framework momentjs


    【解决方案1】:

    您可以在cases 数组上使用$map,并将date string 字段更改为date object 字段。

    Cases.aggregate([
      { "$addFields": {
        "cases": {
          "$map": {
            "input": "$cases",
            "in": {
              "$mergeObjects": [
                "$$this",
                {
                  "createddate": {
                    "$dateFromString": { "dateString": "$$this.createddate" }
                  },
                  "endDate": {
                    "$dateFromString": { "dateString": "$$this.endDate" }
                  }
                }
              ]
            }
          }
        }
      }}
    ])
    

    更新:如果日期为空字符串

    Cases.aggregate([
      { "$addFields": {
        "cases": {
          "$map": {
            "input": "$cases",
            "in": {
              "$mergeObjects": [
                "$$this",
                {
                  "createddate": {
                    "$cond": [
                      { "$eq": ["$$this.createddate", ""] },
                      null
                      { "$dateFromString": { "dateString": "$$this.createddate" } }
                    ]
                  },
                  "endDate": {
                    "$cond": [
                      { "$eq": ["$$this.endDate", ""] },
                      null
                      { "$dateFromString": { "dateString": "$$this.endDate" } }
                    ]
                  }
                }
              ]
            }
          }
        }
      }}
    ])
    

    【讨论】:

    • 嗨@ashh 只是关于上述查询的一个快速问题 - 有一些条目的关闭日期为“”(空白),因此查询会引发错误。有没有办法只设置 case.status: 'CLOSED' (这意味着它肯定有一个关闭日期)?
    • 日期 ("") 为空白或不存在 (null)?
    • 日期为空
    • 您好,您知道如何处理空白日期吗?我尝试了很多方法,但在执行时仍然会出错。
    • @Andrew 如果您还有其他疑问,请提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2021-09-29
    • 2014-03-16
    • 1970-01-01
    • 2017-09-19
    • 2020-02-05
    相关资源
    最近更新 更多