我有一个像这样的文件
{
"_id": "5c2326cb5d558f6693577119",
"date": "08/02/16 00:00",
"symbol": "WLTW",
"open": "113.300003",
"close": 111.160004,
"low": 110.459999,
"high": 113.300003,
"volume": 1200500,
"createdAt": "2018-12-26T06:59:23.901Z",
"updatedAt": "2018-12-26T06:59:23.901Z"
}
我正在执行类似这样的查询
const getStockBySymbol = (data) => {
console.log('Hitting Stock Model fine!!')
return Stock.find({symbol: data})
.then((stocks) => {
console.log(stocks)
if (stocks) { return stocks }
})
}
我需要将date
格式转换为Year-month-date
格式
所以当前格式是dd\mm\yy
属性中的date
,我想将其转换为yyyy-mm-dd
我是MongoDB的新手,如果有人可以帮助
谢谢
答案 0 :(得分:1)
您需要在获取数据后映射结果:
const getStockBySymbol = (data) => {
return Stock.find({symbol: data})
.then((stocks) => {
if (stocks) {
var newStocks=stocks.map(function(stock){
let formattedDate=moment(stock.date,"dd/mm/YY hh:mm").format("YYYY-mm-dd");
stock.date=formattedDate;
return stock;
});
return newStocks;
}
})
}
答案 1 :(得分:0)
您最好的选择是使用momentjs库。这是用于时间格式转换的简便解决方案:
moment(new Date(date)).format('YYYY-MM-DD');
这应该产生'2016-08-02'。
答案 2 :(得分:0)
您可以使用$dateFromString运算符将字符串解析为ISODate。问题在于,年份的所有格式都期望四位数,因此它将解析您的年份为0016
,而不是预期的2016
。要解决此问题,您可以使用$dateToParts和$dateFromParts并手动添加2000
。然后,您可以使用$dateToString将其转换为您的格式,请尝试:
Stockdb.aggregate([
{
$match: { symbol: "WLTW" }
},
{
$addFields: {
date: {
$dateToParts: {
date: { $dateFromString: { dateString: "$date", format: "%d/%m/%Y %H:%M" } }
}
}
}
},
{
$addFields: {
date: {
$dateToString: {
date: {
$dateFromParts: {
day: "$date.day",
month: "$date.month",
year: { $add: [ 2000, "$date.year" ] }
}
},
format: "%Y-%m-%d"
}
}
}
}
])
$addFields在这种情况下会覆盖现有字段
编辑:对于较低的MongoDB版本,您可以使用$substr和$concat运算符,假设您的date
具有固定长度:
Stockdb.aggregate([
{
$match: { symbol: "WLTW" }
},
{
$addFields: {
date: {
$concat: [
'20',
{ $substr: [ "$date", 6, 2 ] },
'-',
{ $substr: [ "$date", 3, 2 ] },
'-',
{ $substr: [ "$date", 0, 2 ] },
]
}
}
}
])