我正试图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作为我的项目的依赖项,所以我正在寻找另一种解决方案.
问题来自于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)
这可以使用:
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |