尝试将对象追加/推送到返回的数组

时间:2018-04-14 17:36:14

标签: javascript mongodb

我有一个checkUser函数,

module.exports.checkUser = (userData) => {
    return new Promise((resolve, reject) => {    
        iUser.find({ userName: userData.userName })
        .exec()
        .then((users) => {

返回一个大小为1的数组,其中一个用户可通过users[0].(...)访问

users[0].loginHistory,我需要推送对象,

 {dateTime: (new Date()).toString(), userAgent: userData.userAgent}

我正在使用MongoDB,并想知道我是否可以做类似的事情,

users[0].loginHistory.push({dateTime: (new Date()).toString(), userAgent: userData.userAgent});

使用userData.userAgent

定义get('User-Agent);的位置

我的架构,

var userSchema = new Schema({
    "userName": {
        type: String,
        unique: true
    },
    "email": String,
    "password": String,
    "loginHistory": {
        "userAgent": String,
        "dateTime": Date
    }
  });

显然push() JS方法对我不起作用。难道我做错了什么?当checkUser完成处理后,在push()之后,它希望用更新的userHistory替换MongoDB集合中的文档,

users[0].loginHistory.push({dateTime: (new Date()).toString(), userAgent: userData.userAgent});
    iUser.update({ 
        userName: users[0].userName},
        { $set: { loginHistory: users[0].loginHistory } 
    })
    .exec()
    .then(() => {
         resolve(users[0]);
     })

任何方向都会非常感激。

2 个答案:

答案 0 :(得分:0)

如果您的JSON对象是Date类型,则它不会将push作为成员函数。你能把userSchema.loginHistory.dateTime转换成数组吗?然后你可以像你想要的那样使用它(即作为列表)。

答案 1 :(得分:0)

loginHistory是模型中的一个对象,但是您在代码中推送它就像它是一个数组一样。 此外,dateTime字段是一个日期,因此无需将其转换为字符串。 如果您需要loginHistory作为集合,请将字段更改为:

"loginHistory": [{
    "userAgent": String,
    "dateTime": Date
}]

然后使用你的作业(不需要toString()):

users[0].loginHistory.push({ dateTime: new Date(), userAgent: userData.userAgent});

如果这不是您想要的,或者您无法更改模型,则需要将代码中的loginHistory分配更改为:

users[0].loginHistory = { dateTime: new Date(), userAgent: userData.userAgent };