查询以修剪现有mongodb数据库字段中的数据

时间:2016-11-11 07:39:33

标签: mongodb date

我有DateOfBirth类型的字段String。目前,我正在以date格式存储yyyy-MM-ddTHH:mm:ss Z

现在我想将现有数据库中的日期格式更改为yyyy-MM-dd我现在不想要时间我只想修改我如何使用mongodb中的查询来做到这一点。 / p>

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

我尝试使用此查询但我没有得到理想的结果。

1 个答案:

答案 0 :(得分: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);
}