在 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 更新年龄的主要内容,如果未能解决你的问题,请参考以下文章