Chatrooms.findOneAndUpdate({Roomname: room.Roomname},{ $setOnInsert: {status: true, userNum: 1}}, {new: true, upsert: true}, function(err, doc) {
if(err) console.log(err);
console.log("DOC " + doc)
if(doc.status) {
// FOUND ROOM SATTUS IS TRUE LOGIC
console.log(doc);
// return callback(true)
}
});
上面的查询将返回给我更新或插入的实际文档,但我无法确切地检查它是哪一个。如果我进行更新而不是findOneandUpdate,我将返回此
{
ok: 1,
nModified: 0,
n: 1,
upserted: [ { index: 0, _id: 55df883dd5c3f7cda6f84c78 } ]
}
如何从写入结果返回文档和写入结果或至少返回upserted字段。
答案 0 :(得分:4)
好吧,我的主要问题是我无法获取我插入的文档的_id,而无法检查是否已更新/找到或插入。但是我了解到你可以生成自己的Id。
id = mongoose.Types.ObjectId();
Chatrooms.findOneAndUpdate({Roomname: room.Roomname},{ $setOnInsert: {_id: id, status: true, userNum: 1}}, {new: true, upsert: true}, function(err, doc) {
if(err) console.log(err);
if(doc === null) {
// inserted document logic
// _id available for inserted document via id
} else if(doc.status) {
// found document logic
}
});
<强>更新强>
Mongoose API v4.4.8
passRawResult:如果为true,则将MongoDB驱动程序的原始结果作为第三个回调参数传递。
答案 1 :(得分:4)
Version 4.1.10 of Mongoose has an option called passRawResult
which if set to true
causes the raw
parameter to be passed. Leaving out this option seems to default to false
and cause raw
to always be undefined
:
passRawResult: if true, passes the raw result from the MongoDB driver as the third callback parameter
http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate
答案 2 :(得分:3)
从2019年8月8日开始(猫鼬版本5.6.9),要设置的属性是“ rawResult”而不是“ passRawResult”:
M.findOneAndUpdate({}, obj, {new: true, upsert: true, rawResult:true}, function(err, d) {
if(err) console.log(err);
console.log(d);
});
输出:
{ lastErrorObject:
{ n: 1,
updatedExisting: false,
upserted: 5d4befa6b44b48c3f2d21c75 },
value: { _id: 5d4befa6b44b48c3f2d21c75, rating: 4, review: 'QQQ' },
ok: 1 }
还请注意,结果将作为回调的第二个参数而不是第三个参数返回。可以通过d.value检索文档。
答案 3 :(得分:0)
我害怕使用 FindOneAndUpdate 不能做你想做的事情,因为它没有中间件和设置器,它提到了文档:
虽然在使用findAndModify帮助程序时会将值强制转换为适当的类型,但不会应用以下内容:
http://mongoosejs.com/docs/api.html在findOneAndUpdate中搜索它 如果你想在更新前获得文档,在更新后获得文档,你可以这样做:
Model.findOne({ name: 'borne' }, function (err, doc) {
if (doc){
console.log(doc);//this is ur document before update
doc.name = 'jason borne';
doc.save(callback); // you can use your own callback to get the udpated doc
}
})
希望它可以帮到你
答案 4 :(得分:0)
我不知道这是怎么完全偏离轨道的,但总是有一个&#34;第三个&#34;对所有.XXupdate()
方法的参数响应,这基本上是来自驱动程序的原始响应。这总是告诉你文件是否已经被&#34; upserted&#34;与否:
Chatrooms.findOneAndUpdate(
{ "Roomname": room.Roomname },
{ "$setOnInsert": {
"status": true, "userNum": 1
}},
{ "new": true, "upsert": true },
function(err, doc,raw) {
if(err) console.log(err);
// Check if upserted
if ( raw.lasErrorObject.n == 1 && !raw.lastErrorObject.updatedExisting ) {
console.log("upserted: %s", raw.lastErrorObject.upserted);
}
console.log("DOC " + doc)
if (doc.status) {
// FOUND ROOM SATTUS IS TRUE LOGIC
console.log(doc);
// return callback(true)
}
});
它将告诉您刚刚插入的文档的_id
。
来自&#34; raw&#34;响应:
{ lastErrorObject:
{ updatedExisting: false,
n: 1,
upserted: 55e12c65f6044f57c8e09a46 },
value: { _id: 55e12c65f6044f57c8e09a46,
status: true,
userNum: 1
__v: 0 },
ok: 1 }
完整的可重复列表:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/test');
var testSchema = new Schema({
name: String
});
var Test = mongoose.model('Test', testSchema, 'test');
async.series(
[
function(callback) {
Test.remove({},callback);
},
function(callback) {
async.eachSeries(
["first","second"],
function(it,callback) {
console.log(it);
Test.findOneAndUpdate(
{ "name": "Bill" },
{ "$set": { "name": "Bill" } },
{ "new": true, "upsert": true },
function(err,doc,raw) {
console.log(raw),
console.log(doc),
callback(err);
}
);
},
callback
);
}
],
function(err) {
if (err) throw err;
mongoose.disconnect();
}
);
哪个输出:
first
{ lastErrorObject:
{ updatedExisting: false,
n: 1,
upserted: 55e2a92328f7d03a06a2dd6b },
value: { _id: 55e2a92328f7d03a06a2dd6b, name: 'Bill', __v: 0 },
ok: 1 }
{ _id: 55e2a92328f7d03a06a2dd6b, name: 'Bill', __v: 0 }
second
{ lastErrorObject: { updatedExisting: true, n: 1 },
value: { _id: 55e2a92328f7d03a06a2dd6b, name: 'Bill', __v: 0 },
ok: 1 }
{ _id: 55e2a92328f7d03a06a2dd6b, name: 'Bill', __v: 0 }