Mongodb在更新时忽略$ push。

时间:2017-06-22 19:20:07

标签: mongodb mongoose

我想把日期/文字推送到我的用户表userLog

usersTable.update (
    { _id: userID },
    { $set: 
        { 
            activityDate : Math.round(new Date().getTime()/1000),
            $push: { 
                userLog : {
                    date: Math.round(new Date().getTime()/1000),
                    text: "Foo Baaaah!!"
                } 
            } 
        }
    }
).exec()

但是Mongoose发射的所有东西都是:

Mongoose: users.update({ _id: 'torben@rudgaard.com' }, { '$set': { activityDate: 1498158837 } }, {})

我的$ push去了哪些想法?

1 个答案:

答案 0 :(得分:2)

正如评论中已经提到的,$push运算符必须与$set处于同一级别。它们都是Update Operators,这意味着您可以使用以下格式指定更新表达式:

{
   <operator1>: { <field1>: <value1>, ... },
   <operator2>: { <field2>: <value2>, ... },
   ...
}

因此,在您的情况下,查询必须如下所示:

usersTable.update(
    { _id: userID },
    {
        $set: {
            activityDate: Math.round(new Date().getTime() / 1000),
        },
        $push: {
            userLog: {
                date: Math.round(new Date().getTime() / 1000),
                text: "Foo Baaaah!!"
            }
        }
    }
).exec();

关于$push$addToSet,完全取决于用例。正如您已经提到的,$addToSet如果已包含项目,则不会向该数组添加项目。 $push将始终添加给定元素,无论它是否存在。