我有一个集合,想要更新或创建新文档和$ inc counter。
我试图移动更新/ upsert对象,但没有效果。
Mongo版本是3.0.11。
update = {
query: {
_id: "ABCDEFG1234"
},
update: {
$setOnInsert: {
$inc: {
counter: 1
}
}
},
new: true,
upsert: true
}
DB.collection('stats').findAndModify(update,function(e,d) { if (e) { console.log(e);} })
/*
{ MongoError: need remove or update
at Function.MongoError.create (~/mongodb/node_modules/mongodb-core/lib/error.js:31:11)
at commandCallback (~/mongodb/node_modules/mongodb-core/lib/topologies/server.js:1154:66)
at Callbacks.emit (~/mongodb/node_modules/mongodb-core/lib/topologies/server.js:119:3)
at .messageHandler (~/mongodb/node_modules/mongodb-core/lib/topologies/server.js:295:23)
at Socket.<anonymous> (~/mongodb/node_modules/mongodb-core/lib/connection/connection.js:285:22)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:172:18)
at Socket.Readable.push (_stream_readable.js:130:10)
at TCP.onread (net.js:542:20)
name: 'MongoError',
message: 'need remove or update',
ok: 0,
errmsg: 'need remove or update' }
*/
我试过
var find = { member_id: "ABCDEFG1234" };
var update = { $set: { update: Date.now() }, $inc: { web_visit: 1 } };
var options = { new: true, upsert: true, };
DB.collection('stats').findAndModify(find,update,options,function(e,d) {
if (e) { console.log(e);}
});
但它现在默默地在'stats'集合中没有任何内容。
答案 0 :(得分:2)
您的更新查询编写错误;你是嵌套操作符,只是抛出一个错误。由于您需要的操作是设置计数器字段并在更新中递增,因此只需 $inc
运算符就足够了,因为如果计数器字段不存在, $inc
会创建字段并将字段设置为指定值。
因此,使用Node.js驱动程序 findAndModify()
方法签名的正确更新操作如下所示:
DB.collection("stats").findAndModify(
{ "_id": "ABCDEFG1234" }, // query object to locate the object to modify
[["_id", "asc"]], // sort array
{ "$inc": { "counter": 1 } }, //document (object) with the fields/vals to be updated
{ "new": true, "upsert": true }, // options to perform an upsert operation.
function(error, doc) { if (doc) { console.log(doc); } }
);