[mongodb]exception: $concat only supports strings, not NumberInt32

今天在用mongodb操作aggregation的时候出现这个问题,我是想格式化日期,例如”2013-10-17 04:41:37 UTC”变成”10月17日”,

'fdate' => { '$concat' => ['$date.month', '月', '$date.day', '日'] }

出现 exception: $concat only supports strings, not NumberInt32

原来$concat只能操作字符串,不支持数字类型,解决办法是用$substr

$date形如’2013-10-13 11:17:18 UTC’

'fdate' => { '$concat' => [ {$substr=>['$date', 5, 2]}, '月', {$substr=>['$date', 8, 2]}, '日'] }

$substr接受两个参数,一个是字符串的起点,一个是截取的字符串的长度。

mongoid distinct

MongoDB里面的distinct很简单,就是找出集合中某一个字段的所有不同的值。
例子,假设如下的users文档:

{
   "_id" : ObjectId("4df02258aca01b0ce1000005"),
   "email" : "xxxxxx@gmail.com",
   "name" : "zires",
   "sign_in_count" : 3 }
{
   "_id" : ObjectId("4e149630aca01b0b66000002"),
   "email" : "wangshi@gmail.com",
   "name" : "wangshi",
   "sign_in_count" : 3 }
{
   "_id" : ObjectId("4e149660aca01b0b66000006"),
   "email" : "xixihaha@gmail.com",
   "name" : "xixihaha",
   "sign_in_count" : 2 }

在mongo中运行如下shell

db.runCommand({"distinct" : "users", "key" : "name"})

结果:

{
  "values" : [
    "zires",
    "wangshi",
    "xixihaha"
  ],
  "stats" : {
    "n" : 3,
    "nscanned" : 3,
    "nscannedObjects" : 3,
    "timems" : 0
  },
  "ok" : 1
}

在mongoid中的操作:

User.collection.distinct(:name)
# => ["zires", "wangshi", "xixihaha"]