在 Mongodb 的集合中根据 dob 更新年龄

Posted

技术标签:

【中文标题】在 Mongodb 的集合中根据 dob 更新年龄【英文标题】:Update age based on dob in a collection in Mongodb 【发布时间】:2016-11-20 15:10:23 【问题描述】:

我在其中一个集合中有 1000 个文档。

"_id": ObjectId("56d97671f6ad671b7d1c3d76"), "parseId": “TdKxj9FFPY”,“电话”:“6643545645”,“dob”:“15-06-87”,“年龄”:121 "createdAt": ISODate("2016-03-01T16:39:00.947Z"), "updatedAt": ISODate("2016-03-01T16:39:00.947Z"), "__v": 0

"_id":ObjectId("56d97671f6ad671b7d1c3d76"), "parseId": "TdKxj9FFPY", “电话”:“9847523654”,“dob”:“15-06-93”,“年龄”:100 “createdAt”: ISODate("2016-03-01T16:39:00.947Z"), "updatedAt": ISODate("2016-03-01T16:39:00.947Z"), "__v": 0

"_id":ObjectId("56d97671f6ad671b7d1c3d76"), "parseId": "TdKxj9FFPY", “电话”:“4564646646”,“dob”:“15-06-43”,“年龄”:152 “createdAt”: ISODate("2016-03-01T16:39:00.947Z"), "updatedAt": ISODate("2016-03-01T16:39:00.947Z"), "__v": 0

.......

.......

但是 age 的某些值是错误的。dob 的值是正确的。所以我需要在单个中根据 dob 更新 age 的值手动查询?

【问题讨论】:

您是在询问如何通过 mysql 查询、仅通过 json 操作 (nosql) 或通过其他方式访问此数据? 为什么将相同的信息存储两次?有一个规范的表示(DoB,可能比DD-MM-YY 更合理的格式)并在必要时根据它计算年龄。 @Dreamlines :我想使用终端(nosql)更新集合 @jonrsharpe:年龄值是错误的。但是 dob 是正确的。 是的,我明白,我的意思是您应该从数据库中删除年龄,并且可能将 DoB 更新为您可以合理订购的格式。否则,您必须(至少)每天更新您的数据库,以使当前年龄保持最新。 【参考方案1】:

已编辑:我对第一个不好。

将您的数据导出为 JSON 并通过它运行并重新导入。你唯一的依赖是 fs 和 momentjs。

var moment = require('moment'),
    fs = require('fs'),
    json = [
         "_id":"56d97671f6ad671b7d1c3d76", "parseId": "TdKxj9FFPY", "phone": "6643545645", "dob": "15-06-87", "age": 121, "createdAt": "2016-03-01T16:39:00.947Z", "updatedAt": "2016-03-01T16:39:00.947Z", "__v": 0 ,
         "_id":"56d97671f6ad671b7d1c3d76", "parseId": "TdKxj9FFPY", "phone": "9847523654", "dob": "15-06-93", "age": 100, "createdAt": "2016-03-01T16:39:00.947Z", "updatedAt": "2016-03-01T16:39:00.947Z", "__v": 0 ,
         "_id":"56d97671f6ad671b7d1c3d76", "parseId": "TdKxj9FFPY", "phone": "4564646646", "dob": "15-06-43", "age": 152, "createdAt": "2016-03-01T16:39:00.947Z", "updatedAt": "2016-03-01T16:39:00.947Z", "__v": 0 
    ];

Object.keys(json).forEach(function(key) 
    age = moment().diff(moment(json[key].dob,"DD/MM/YY"),'years');

    //
    //dates before 1970 are negative
    //
    if (parseInt(age) < 0) 
        age += 100;
    

    json[key].age = age;
);

fs.writeFile('data.json', JSON.stringify(json), function (err) 
  if (err) return console.log(err);
  console.log('compeleted');
);

年龄输出 = [29, 23, 74];

【讨论】:

你是完全正确的。我会在一秒钟内更新这个。累了,没有思考【参考方案2】:

最后我找到了一个解决方案。我只是将集合导出到一个 json 文件并使用 js 函数更新所有文档并将集合导入到数据库中。

html

<html>

<head>
    <script type="text/javascript" src="https://rawgit.com/eligrey/FileSaver.js/master/FileSaver.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>

<body>
    <button id="save">save</button>
</body>
<script type="text/javascript">
function getAge(dateString) 
    var today = new Date();
    var birthDate = new Date(dateString);
    var age = today.getFullYear() - birthDate.getFullYear();
    var m = today.getMonth() - birthDate.getMonth();
    if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) 
        age--;
    
    return age;

var exportData;
$.getJSON("input.json", function(data) 
    exportData = data;
    exportData.forEach(function(item, index) 
        // console.log('item dob', item.dob);
        var dobInfo = item.dob.split('-');
        var dd = dobInfo[0];
        if (dd < 10) 
            dd = '0' + dd;
        
        var mm = dobInfo[1];
        if (mm < 10) 
            mm = '0' + mm;
        
        var yy = dobInfo[2];
        yy = (yy < 17) ? '20' + yy : '19' + yy;
        // console.log('dd', dd);
        // console.log('mm', mm);
        // console.log('yy', yy);
        var newdate = mm + '-' + dd + '-' + yy;
        // console.log('newdate',newdate);
        console.log('index[' + index + ']', item.dob);
        var age = getAge(newdate);
        console.log('age--->', age);
        exportData[index].age = age;
    );
);
document.getElementById('save').onclick = function() 
    var textToSave = JSON.stringify(exportData),
        filename = 'output.json',
        blob = new Blob([textToSave], 
            type: "text/plain;charset=utf-8"
        );

    saveAs(blob, filename);

</script>

</html>

【讨论】:

以上是关于在 Mongodb 的集合中根据 dob 更新年龄的主要内容,如果未能解决你的问题,请参考以下文章

如何从c#中的dob计算年龄[重复]

从特定时间限制 UIDatePicker 日期。例如输入 DOB 到有限制的年龄限制

PHP 从DOB计算年龄

如何计算rails admin中的年龄作为出口值?

在 mongodb python 上根据日期上传和过滤年龄

更新嵌套的 MongoDB 集合 (Pymongo)