如何更改MongoDB中字段的类型

时间:2013-11-03 17:18:38

标签: mongodb

以下是我的问题:

  1. 如何在MongoDB中将一个字段中的所有字符串类型“NULL”更改为null类型的空值?

  2. 如何在MongoDB中将一个字段中的所有字符串类型“20xx-xx-xx”更改为日期类型?

1 个答案:

答案 0 :(得分:4)

db.foo.insert({bar: "NULL", date: "2012-11-30"})
db.foo.insert({bar: "NULL", date: "2010-09-21"})
db.foo.insert({bar: "NOTNULL", date: "2010-09-21"})
  

如何在MongoDB中将一个字段中的所有字符串类型“NULL”更改为空类型的空值?

db.foo.update({bar: "NULL"}, {$set: {bar: null}}, {multi: true})
  

如何在MongoDB中将一个字段中的所有字符串类型“20xx-xx-xx”更改为日期类型?

db.foo.find({date: {$exists: true}}).forEach(
   function(doc) {doc.date = new Date(doc.date); db.foo.save(doc)}
)

修改

如果由于某种原因您遇到默认解析问题,可以手动完成:

让我们假设你有这样的文件

doc = {date: "2012-01-30"}

首先分割字符串表示超量并将每个表达式转换为整数

dateArray = doc.date.split('-').map(function(s) { return parseInt(s); })

从月份字段中减去1(js中的月数从0开始计算)

dateArray[1] -= 1

现在我们可以创建新的日期对象。有些事情需要考虑。解析字符串到日期时,假设使用此字符串表示UTC日期:

new Date("2012-01-30")

你会得到

ISODate("2012-01-30T00:00:00Z") 

您也可以像这样创建Date构造函数

new Date(dateArray[0], dateArray[1], dateArray[2])

但它会假设数据使用本地tz所以在我的情况下(GMT + 1)我得到:

ISODate("2012-01-29T23:00:00Z")

如果不是您想要的,您可以手动设置一些字段:

date = new Date(0) // ISODate("1970-01-01T00:00:00Z")
date.setUTCFullYear(dateArray[0], dateArray[1], dateArray[2])

现在日期如下:

ISODate("2012-01-30T00:00:00Z")

将它们全部包装在一起:

db.foo.find({date: {$exists: true}}).forEach(
   function(doc) {
       dateArray = doc.date.split('-').map(function(s) { return parseInt(s); });
       dateArray[1] -= 1;

       date = new Date(0);
       date.setUTCFullYear(dateArray[0], dateArray[1], dateArray[2]);

       doc.date = date;
       db.foo.save(doc)
    }
)