猿问

更新 mongodb 对象内对象值的最佳方法

这就是我在 mongodb 集合中存储每个元素的方式。


{

  _id: 'iTIBHxAb8',

  title: 'happy birthday',

  votesObject: { happy: 0, birthday: 0 }

}

我做了一件非常肮脏的工作,对此我一点也不感到自豪,这就是......


//queryObject= {id,chosenvalue};

let queryObject = req.query;

let id = Object.keys(queryObject)[0];

let chosenValue = queryObject[id];

db.collection("voting")

            .find({ _id: id })

            .toArray((err, data) => {

                let { votesObject } = data[0];

                votesObject[chosenValue] += 1;

                data[0].votesObject = votesObject;

                db.collection("voting").replaceOne({ _id: id }, data[0]);

                res.redirect("/polls?id=" + id);

            });

所以基本上它的作用是从上面的示例中获取可能是“快乐”或“生日”的选定值。

  • 从集合中查找与 id 匹配的完整对象。

  • 从找到的对象中增加所选值。

  • 使用replaceOne()将之前的对象替换为新更改的对象。

每次执行这段代码时,我都会将所选值内的值增加一。

这工作得很好,但我想知道是否有任何方法可以直接更新所选值而不会出现这些混乱。我在其他地方找不到办法做到这一点。


慕容708150
浏览 156回答 2
2回答

蝴蝶刀刀

你可以使用 mongoose findOneAndUpdate 它将类似于const updateKey = "votesObject.$."+ chosenValuelet incQuery = {}incQuery[updateKey] = 1Model.findOneAndUpdate(    { _id: id },     { $inc: incQuery },    { new : false },     callback)

莫回无

您可以使用$inc运算符。尝试这样的事情:db.collection.update({  "_id": id},{  "$inc": {    "votesObject.birthday": 1  }})此查询会将您的字段加birthday一。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答