没有mongoose,不能从nodejs xor mongodb字段

roc*_*now 8 mongodb node.js

我正试图status在这样的文件中对这个字段进行xor :

{
    "_id" : ObjectId("58c51e1aedb6e4000410ddbf"),
    "query" : "developer",
    "user_id" : "1413322622039651",
    "status" : 1,
    "links" : [
        "840673302343483394",
        "840672745222483968",
        "840672580717686785",
        "840672427550089216",
        "840582170548850688",
        "840581988918669312"
    ],
    "links_size" : 6,
    "created" : ISODate("2017-03-12T10:08:26.369Z")
}
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码:

var args = {'_id': new ObjectID(queryId)};
var bit = {$bit: {'status': {xor: 1}}};
db.collection('query').update(args, bit, function(err, result) {});
Run Code Online (Sandbox Code Playgroud)

查询不会产生错误,但status不会更改字段.我认为问题在于它将1解释为double而不是整数.我试过了:parseInt(1)但它也没有效果.我尝试使用NumberInt(1)但得到了错误NumberInt is not defined.

所以我不能在我的代码中使它工作; 但是,通过mongo shell的等效查询按预期工作:

db.query.update(
  {"_id":ObjectId("58c3b98e458f0700045b1846")}, 
  {"$bit":{"status":{"xor":NumberInt(1)}}}
)
Run Code Online (Sandbox Code Playgroud)

我用google搜索,发现它NumberInt存在于mongoose-int32包中,但它需要猫鼬.我不想添加mongoose作为我的项目的依赖项,所以我正在寻找另一种解决方案.

fel*_*lix 4

问题来自于status文档中存储的字段类型

这里是

{ "status" : 1, ... }

但你应该有这个:

{ "status" : NumberLong(1), ... }

首先,使用此代码将所有状态字段转换为 NumberLong(直接在 shell 中运行)

db.query.find().forEach( function(obj) {
    obj.status = new NumberLong(obj.status);
    db.query.save(obj);
});
Run Code Online (Sandbox Code Playgroud)

然后只需更新您以前的代码,如下所示:

const MongoClient = require('mongodb').MongoClient
const ObjectId = require('mongodb').ObjectId
const Long = require('mongodb').Long

MongoClient.connect('mongodb://localhost:27017/database', function (err, db) {
  if (err != null) {
    console.log(err)
  } else {
    let args = {'_id': new ObjectId('58c64231b13b6239d9e496da')}
    let bit = {$bit: {'status': {xor: Long.fromInt(1)}}}

    db.collection('query').update(args, bit, function (err, result) {
      if (err != null) {
        console.error(err)
      }
      db.close()
    })
  }
})
Run Code Online (Sandbox Code Playgroud)

这可以使用:

  • 节点 v 7.3.0
  • npm 包 mongodb 2.2.24
  • MongoDB 3.4.1