2016-11-11 72 views
0

我有一个字段DateOfBirth类型String。目前我以yyyy-MM-ddTHH:mm:ss Z的格式存储date查询修整现有的mongodb数据库字段的数据

现在我想改变现有数据库中的日期格式为yyyy-MM-dd我不想现在我只是想修剪我如何使用mongodb中的查询来做到这一点。

db.profile.update({}, { $set : { "physical.dateOfBirth" : "2012-01-11" } }, true, true); 

我试过使用这个查询我没有得到想要的结果。

回答

0

目前,除了递增和递减之外,您不能更新基于mongodd当前值的值。

您将首先需要找到每个值,然后在再次保存之前更新它们。

你可以做多种方式:

get all profiles (only need _id and properties to update) 
for each profile 
    set the value to its yyyy-MM-dd value 
    save profile 

get all profiles (only need _id and properties to update) 
create bulkOp  
for each profile 
    set the value to its yyyy-MM-dd value 
    add update to bulkOp 
execute bulkOp 

aggregate to find distinct yyyy-MM-dd values 
for each <yyyy-MM-dd value> 
    var match = {"physical.dateOfBirth": {$regex: <yyyy-MM-dd value>}}; 
    var update = {$set: {"physical.dateOfBirth": <yyyy-MM-dd value>}}; 
    var multi = {multi: true}; 
    db.profiles.update(match, update, multi); 

显然,这仅仅是你可以尝试的过程,而不是实际的代码。

最后一种方法将是最简单的内存,因为你实际上不会将很多内存加载到内存中,只是不同的值包含了具有相同日期的100个或1000个值。

好运

编辑:沿此线的东西:

在_id的$ cond是刚刚在1项匹配在一起的一切

var aggregate = db.profiles.aggregate({$group: { 
    _id: {$cond: ['_id', 'a', 'a']}, 
    values: {$addToSet: { $dateToString: { format: '%Y-%m-%d', date: '$physical.dateOfBirth' } }} 
}}); 
var values = aggregate[0].values; 


for(var i = 0; i < values.length; i++) { 
    var date = new Date(values[i]); 
    var nextDay = new Date().setDate(date.getDate() + 1); 

    var match = {'physical.dateOfBirth': {$gte: date, $lte: nextDay}}; 
    var update = {$set: {'physical.dateOfBirth': date}}; 
    var multi = {multi: true}; 

    db.profiles.update(match, update, multi); 
} 
+0

请告诉我查询 –

+0

“physical.dateOfBirth”有什么结构。 是{physical:{dateOfBirth:value}}还是{'physical.dateOfBirth':value}? –

+0

它是{'physical.dateOfBirth':value} –