Mongodb异常可以';t从BSON类型EOO转换为日期

Mongodb异常可以';t从BSON类型EOO转换为日期,mongodb,mongodb-query,Mongodb,Mongodb Query,我正在尝试根据年、月、日对mongodb查询进行分组 我的数据存储在数据库中,如下所示: { "installAt" : "2016-08-01T10:24:38.502Z", "success" : true "app" : "web" } db.sampleCollection.aggregate( [ { $group : {

我正在尝试根据年、月、日对mongodb查询进行分组

我的数据存储在数据库中,如下所示:

{
"installAt" : "2016-08-01T10:24:38.502Z",
"success" : true
"app" : "web"
}
db.sampleCollection.aggregate(
       [
          {
            $group : {
               _id : { month: { $month: "$installAt" }, day: { $dayOfMonth: "$installAt" }, year: { $year: "$installAt" } },
               count: { $sum: 1 }
            }
          }
       ]
    )
 assert: command failed: {
        "errmsg" : "exception: can't convert from BSON type EOO to Date",
        "code" : 16006,
        "ok" : 0
} : aggregate failed
Error: command failed: {
        "errmsg" : "exception: can't convert from BSON type EOO to Date",
        "code" : 16006,
        "ok" : 0
} : aggregate failed
    at Error (<anonymous>)
    at doassert (src/mongo/shell/assert.js:11:14)
    at Function.assert.commandWorked (src/mongo/shell/assert.js:244:5)
    at DBCollection.aggregate (src/mongo/shell/collection.js:1149:12)
    at (shell):1:23
2016-12-07T19:48:25.541+0530 Error: command failed: {
        "errmsg" : "exception: can't convert from BSON type EOO to Date",
        "code" : 16006,
        "ok" : 0
} : aggregate failed at src/mongo/shell/assert.js:13
我试图使用的查询实现上述目标

{
"installAt" : "2016-08-01T10:24:38.502Z",
"success" : true
"app" : "web"
}
db.sampleCollection.aggregate(
       [
          {
            $group : {
               _id : { month: { $month: "$installAt" }, day: { $dayOfMonth: "$installAt" }, year: { $year: "$installAt" } },
               count: { $sum: 1 }
            }
          }
       ]
    )
 assert: command failed: {
        "errmsg" : "exception: can't convert from BSON type EOO to Date",
        "code" : 16006,
        "ok" : 0
} : aggregate failed
Error: command failed: {
        "errmsg" : "exception: can't convert from BSON type EOO to Date",
        "code" : 16006,
        "ok" : 0
} : aggregate failed
    at Error (<anonymous>)
    at doassert (src/mongo/shell/assert.js:11:14)
    at Function.assert.commandWorked (src/mongo/shell/assert.js:244:5)
    at DBCollection.aggregate (src/mongo/shell/collection.js:1149:12)
    at (shell):1:23
2016-12-07T19:48:25.541+0530 Error: command failed: {
        "errmsg" : "exception: can't convert from BSON type EOO to Date",
        "code" : 16006,
        "ok" : 0
} : aggregate failed at src/mongo/shell/assert.js:13
但是我得到了这个错误:

{
"installAt" : "2016-08-01T10:24:38.502Z",
"success" : true
"app" : "web"
}
db.sampleCollection.aggregate(
       [
          {
            $group : {
               _id : { month: { $month: "$installAt" }, day: { $dayOfMonth: "$installAt" }, year: { $year: "$installAt" } },
               count: { $sum: 1 }
            }
          }
       ]
    )
 assert: command failed: {
        "errmsg" : "exception: can't convert from BSON type EOO to Date",
        "code" : 16006,
        "ok" : 0
} : aggregate failed
Error: command failed: {
        "errmsg" : "exception: can't convert from BSON type EOO to Date",
        "code" : 16006,
        "ok" : 0
} : aggregate failed
    at Error (<anonymous>)
    at doassert (src/mongo/shell/assert.js:11:14)
    at Function.assert.commandWorked (src/mongo/shell/assert.js:244:5)
    at DBCollection.aggregate (src/mongo/shell/collection.js:1149:12)
    at (shell):1:23
2016-12-07T19:48:25.541+0530 Error: command failed: {
        "errmsg" : "exception: can't convert from BSON type EOO to Date",
        "code" : 16006,
        "ok" : 0
} : aggregate failed at src/mongo/shell/assert.js:13
assert:命令失败:{
“errmsg”:“异常:无法从BSON类型EOO转换为日期”,
“代码”:16006,
“确定”:0
}:聚合失败
错误:命令失败:{
“errmsg”:“异常:无法从BSON类型EOO转换为日期”,
“代码”:16006,
“确定”:0
}:聚合失败
错误()
在doassert(src/mongo/shell/assert.js:11:14)
在Function.assert.commandWorked(src/mongo/shell/assert.js:244:5)
在DBCollection.aggregate(src/mongo/shell/collection.js:1149:12)
在(壳牌):1:23
2016-12-07T19:48:25.541+0530错误:命令失败:{
“errmsg”:“异常:无法从BSON类型EOO转换为日期”,
“代码”:16006,
“确定”:0
}:聚合在src/mongo/shell/assert.js处失败:13
此异常的一个原因可能是(我不确定),因为

“installAt”:“2016-08-01T10:24:38.502Z”

不是mongodb日期格式,而是字符串

如果这是一个问题,那么解决这个问题的一种方法就是将这些字段更新为
ISODate
格式,例如

ISODate(“2016-08-01T10:24:38.502Z”)

但是由于某些原因,我现在不能修改我的数据库

是我使用上述代码或替代代码实现分组的任何方式,
(不更新数据库)

是的,这就是问题所在。你的约会是字符串

我插入了一个像

db.date1.insert(
{ "installAt" : new ISODate("2016-08-01T10:24:38.502Z"), 
"success" : true ,"app" : "web" })
并运行您的查询

db.date1.aggregate(
       [
          {
            $group : {
               _id : { month: { $month: "$installAt" }, day: { $dayOfMonth: "$installAt" }, year: { $year: "$installAt" } },
               count: { $sum: 1 }
            }
          }
       ]
    )
还我

{ "_id" : { "month" : 8, "day" : 1, "year" : 2016 }, "count" : 1 }
现在,如果您不热衷于重新创建您的收藏并转换 installAt as date您可以做的是更改字段类型 使用$type运算符

关于如何做到这一点的示例如下:

var cursor = db.date1.find(); 
while (cursor.hasNext()) { 
  var doc = cursor.next(); 
  db.date1.update({_id : doc._id}, {$set : {installAt: new ISODate(doc.installAt) }});
}

是的,这就是问题所在。你的约会是字符串

我插入了一个像

db.date1.insert(
{ "installAt" : new ISODate("2016-08-01T10:24:38.502Z"), 
"success" : true ,"app" : "web" })
并运行您的查询

db.date1.aggregate(
       [
          {
            $group : {
               _id : { month: { $month: "$installAt" }, day: { $dayOfMonth: "$installAt" }, year: { $year: "$installAt" } },
               count: { $sum: 1 }
            }
          }
       ]
    )
还我

{ "_id" : { "month" : 8, "day" : 1, "year" : 2016 }, "count" : 1 }
现在,如果您不热衷于重新创建您的收藏并转换 installAt as date您可以做的是更改字段类型 使用$type运算符

关于如何做到这一点的示例如下:

var cursor = db.date1.find(); 
while (cursor.hasNext()) { 
  var doc = cursor.next(); 
  db.date1.update({_id : doc._id}, {$set : {installAt: new ISODate(doc.installAt) }});
}

你可以用下面的方法来做,但这不是唯一的方法

varcursor=db.sampleCollection.find({"installAt": { "$exists": true }});
while(cursor.hasNext()){
  vardoc=cursor.next();
  db.tempcollection.insert({ "_id": doc._id, "installAt": newISODate(doc.installAt), "success": doc.success, "app": doc.web })
};

db.tempCollection.aggregate([
  {
    $group: {
      _id: {
        month: {
          $month: "$installAt"
        },
        day: {
          $dayOfMonth: "$installAt"
        },
        year: {
          $year: "$installAt"
        }
      },
      count: {
        $sum: 1
      }
    }
  }
])

在这种方法中,我们创建了一个新集合“tempcollection”,因为要求不修改/更新现有集合。我们可以在完成操作后删除此tempcollection。

您可以通过以下方法执行此操作,但这不是唯一的方法

varcursor=db.sampleCollection.find({"installAt": { "$exists": true }});
while(cursor.hasNext()){
  vardoc=cursor.next();
  db.tempcollection.insert({ "_id": doc._id, "installAt": newISODate(doc.installAt), "success": doc.success, "app": doc.web })
};

db.tempCollection.aggregate([
  {
    $group: {
      _id: {
        month: {
          $month: "$installAt"
        },
        day: {
          $dayOfMonth: "$installAt"
        },
        year: {
          $year: "$installAt"
        }
      },
      count: {
        $sum: 1
      }
    }
  }
])

在这种方法中,我们创建了一个新集合“tempcollection”,因为要求不修改/更新现有集合。一旦我们完成操作,我们就可以删除此临时集合。

您可以通过使用对月份和日期进行分组来轻松实现此目的

db.sampleCollection.aggregate({
    $group: {
        _id: {
            "year": {
                "$substr": ["$installAt", 0, 4]
            },
            "day": {
                "$substr": ["$installAt", 5, 2]
            }
        },
        count: {
            $sum: 1
        }
    }
})

您可以通过使用对月份的年份和日期进行分组来轻松实现这一点

db.sampleCollection.aggregate({
    $group: {
        _id: {
            "year": {
                "$substr": ["$installAt", 0, 4]
            },
            "day": {
                "$substr": ["$installAt", 5, 2]
            }
        },
        count: {
            $sum: 1
        }
    }
})

谢谢你的帮助。您的解决方案可以工作,但由于某些原因,目前我无法更新数据库您的解决方案可以工作,但您没有使用$type运算符。谢谢您的帮助。您的解决方案可以工作,但由于某些原因,目前我无法更新数据库您的解决方案可以工作,但您没有使用$type运算符。