如何根据以前的值更新MongoDB文档?

时间:2018-07-13 15:04:43

标签: javascript node.js mongodb

对不起,如果这很简单,但是我是mongodb新手,还没有找到答案:

假设我正在执行以下操作:

db.collection("bugs").updateOne({ _id: searchId }, { $set: { "fixed": true }}

如何将“固定”设置为与“固定”的最后一个值相反?没有任何其他查询?像{ $set: { "fixed": !fixed }}

3 个答案:

答案 0 :(得分:4)

到目前为止,通过坚持存储布尔值的想法(在将来的MongoDB版本中可能),仅凭一个操作实际上就不可能在MongoDB中实现此目标。但是,有一种解决方法,可以通过存储代表真或假的位(0或1)而不是布尔值,并对MongoDB中的位执行按位异或运算,如下所示:

db.collection("bugs").updateOne(
  {
    _id: searchId
  },
  { 
    $bit : {
     fixed: {
       xor: NumberInt(1)
     }
    }
  }
)

请注意,您还必须将 0 存储为NumberInt(0)来表示false,将 1 存储为NumberInt(1)来表示{默认情况下,固定道具中的{1}}作为MongoDB会将所有数字视为浮点值。

答案 1 :(得分:2)

这在MongoDB中是不可能的。您必须从数据库中检索文档,然后对其进行更新:

var doc = db.collection("bugs").findOne({ _id: searchId });
db.collection("bugs").updateOne({ _id: searchId }, { $set: { "fixed": !doc.fixed } }

答案 2 :(得分:0)

是的,当然可以用 MongoDB 做到这一点!! ...只需像这样使用 find 的 forEach 功能:

db.collection("bugs").find({ _id: searchId }).forEach(function(bugDoc) { 
  db.collection("bugs").updateOne({ _id: searchId }, { $set: { "fixed": !bugDoc.fixed }});
});

注意:bugDoc 包含原始文档的所有字段,您可以在此双操作更新中进行您想要的所有计算和更改