Mongodb updateOne() 的更新插入选项不起作用
Mongodb upsert option with updateOne() does not work
我目前正在解决一个问题,而我的代码允许通过 *ngFor 更新对象数据,但不允许通过 updateOne() 函数更新插入。
根据其他帖子,添加修饰符 $set 应该可以解决问题,我已经将其合并到我的代码中但无济于事。
这是我的代码。
api.js(后端)
router.route('carousel/update/:_id').put(function(req, res) {
db.collection('home').updateOne({"_id": ObjectId(req.params._id)},
{$set: req.body}, {upsert: true}, (err, results) => {
if (err) throw err;
res.send(results)
console.log(results)
console.log(req.params._id)
});
});
为了更好地理解我的代码如何工作,这是连接我的 api.js[=53= 的 angular 服务] 我的 component.ts.
service.ts
updateSlide(id: number, newheader: string, subheader: string){
return this.http.put<any[]>('./api/carousel/update/' + id, {'header': newheader, 'subheader': newsubheader})
}
最后,我的 component.ts 文件。
component.ts
carousels: any = [];
updateSlide(id: number){
this.HomeService.updateSlide(id, this.header, this.subheader).subscribe(slides => {
this.carousels = slides;
console.log(slides)
})
}
使用上面的代码,当我尝试更新没有 _id 的对象时,我希望 upsert 选项创建一个新文档。由于我是 MEAN 的新手,请多多包涵!
编辑
console.log(req.body)
给出了 {header: 'header', subheader 'subheader'}
的结果,这与我数据库中的数据相似。
console.log(results)
return:
result:
{ n: 1,
nModified: 1,
opTime: { ts: [Timestamp], t: 1 },
electionId: 7fffffff0000000000000001,
ok: 1,
operationTime:
Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1571727952 },
'$clusterTime': { clusterTime: [Timestamp], signature: [Object] } },
connection:
Connection {
_events:
[Object: null prototype] {
error: [Function],
close: [Function],
timeout: [Function],
parseError: [Function],
message: [Function] },
_eventsCount: 5,
_maxListeners: undefined,
id: 0,
options:
{ host: 'ds259367.mlab.com',
port: 59367,
size: 5,
minSize: 0,
connectionTimeout: 30000,
socketTimeout: 360000,
keepAlive: true,
keepAliveInitialDelay: 300000,
noDelay: true,
ssl: false,
checkServerIdentity: true,
ca: null,
crl: null,
cert: null,
key: null,
passphrase: null,
rejectUnauthorized: false,
promoteLongs: true,
promoteValues: true,
promoteBuffers: false,
reconnect: true,
reconnectInterval: 1000,
reconnectTries: 30,
domainsEnabled: false,
legacyCompatMode: true,
disconnectHandler: [Store],
cursorFactory: [Function: Cursor],
emitError: true,
monitorCommands: false,
promiseLibrary: [Function: Promise],
clientInfo: [Object],
servers: [Array],
caseTranslate: true,
useNewUrlParser: true,
auth: [Object],
authSource: 'tawebdb',
dbName: 'tawebdb',
socketTimeoutMS: 360000,
connectTimeoutMS: 30000,
retryWrites: true,
useRecoveryToken: true,
readPreference: [ReadPreference],
credentials: [MongoCredentials],
bson: BSON {} },
logger: Logger { className: 'Connection' },
bson: BSON {},
tag: undefined,
maxBsonMessageSize: 67108864,
port: 59367,
host: 'ds259367.mlab.com',
socketTimeout: 360000,
keepAlive: true,
keepAliveInitialDelay: 300000,
connectionTimeout: 30000,
responseOptions:
{ promoteLongs: true,
promoteValues: true,
promoteBuffers: false },
flushing: false,
queue: [],
writeStream: null,
destroyed: false,
hashedName: '09c68a091568e21c31a31a2ad4f8286db4fb6fb3',
workItems: [],
socket:
Socket {
connecting: false,
_hadError: false,
_handle: [TCP],
_parent: null,
_host: 'ds259367.mlab.com',
_readableState: [ReadableState],
readable: true,
_events: [Object],
_eventsCount: 5,
_maxListeners: undefined,
_writableState: [WritableState],
writable: true,
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: null,
_server: null,
timeout: 360000,
[Symbol(asyncId)]: 7,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]:
Timeout {
_called: false,
_idleTimeout: 360000,
_idlePrev: [TimersList],
_idleNext: [TimersList],
_idleStart: 14489,
_onTimeout: [Function: bound ],
_timerArgs: undefined,
_repeat: null,
_destroyed: false,
[Symbol(unrefed)]: true,
[Symbol(asyncId)]: 1899,
[Symbol(triggerId)]: 7 },
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0 },
buffer: null,
sizeOfMessage: 0,
bytesRead: 0,
stubBuffer: null,
ismaster:
{ hosts: [Array],
setName: 'rs-ds259367',
setVersion: 1,
ismaster: true,
secondary: false,
primary: 'ds259367-a.mlab.com:59367',
me: 'ds259367-a.mlab.com:59367',
electionId: 7fffffff0000000000000001,
lastWrite: [Object],
maxBsonObjectSize: 16777216,
maxMessageSizeBytes: 48000000,
maxWriteBatchSize: 100000,
localTime: 2019-10-22T07:05:40.313Z,
logicalSessionTimeoutMinutes: 30,
minWireVersion: 0,
maxWireVersion: 6,
readOnly: false,
ok: 1,
operationTime: [Timestamp],
'$clusterTime': [Object] },
lastIsMasterMS: 227 },
message:
BinMsg {
parsed: true,
raw:
<Buffer f5 00 00 00 00 2c e8 09 04 00 00 00 dd 07 00 00 00 00 00 00 00 e0 00 00 00 10 6e 00 01 00 00 00 10 6e 4d 6f 64 69 66 69 65 64 00 01 00 00 00 03 6f 70 ... >,
data:
<Buffer 00 00 00 00 00 e0 00 00 00 10 6e 00 01 00 00 00 10 6e 4d 6f 64 69 66 69 65 64 00 01 00 00 00 03 6f 70 54 69 6d 65 00 1c 00 00 00 11 74 73 00 01 00 00 ... >,
bson: BSON {},
opts:
{ promoteLongs: true,
promoteValues: true,
promoteBuffers: false },
length: 245,
requestId: 166210560,
responseTo: 4,
opCode: 2013,
fromCompressed: undefined,
responseFlags: 0,
checksumPresent: false,
moreToCome: false,
exhaustAllowed: false,
promoteLongs: true,
promoteValues: true,
promoteBuffers: false,
documents: [ [Object] ],
index: 229,
hashedName: '09c68a091568e21c31a31a2ad4f8286db4fb6fb3' },
modifiedCount: 1,
upsertedId: null,
upsertedCount: 0,
matchedCount: 1 }
您必须检查以下条件:
router.route('carousel/update/:_id').put(function(req, res) {
var id;
if(req.params._id == 'undefined')
{
id = '';. --------> have to careful there should not be any document with id='' in yourDB at any case
} else {
id = ObjectId(req.params._id)
}
db.collection('home').updateOne({"_id": id},
{$set: req.body}, {upsert: true}, (err, results) => {
if (err) throw err;
res.send(results)
console.log(results)
console.log(req.params._id)
});
});
进口,
进口org.mongodb.scala.model.UpdateOptions
像这样尝试::
updateOne(equal("vendor_id", vendorId),
inc("views_count", views),
UpdateOptions().upsert(true))
我目前正在解决一个问题,而我的代码允许通过 *ngFor 更新对象数据,但不允许通过 updateOne() 函数更新插入。
根据其他帖子,添加修饰符 $set 应该可以解决问题,我已经将其合并到我的代码中但无济于事。
这是我的代码。
api.js(后端)
router.route('carousel/update/:_id').put(function(req, res) {
db.collection('home').updateOne({"_id": ObjectId(req.params._id)},
{$set: req.body}, {upsert: true}, (err, results) => {
if (err) throw err;
res.send(results)
console.log(results)
console.log(req.params._id)
});
});
为了更好地理解我的代码如何工作,这是连接我的 api.js[=53= 的 angular 服务] 我的 component.ts.
service.ts
updateSlide(id: number, newheader: string, subheader: string){
return this.http.put<any[]>('./api/carousel/update/' + id, {'header': newheader, 'subheader': newsubheader})
}
最后,我的 component.ts 文件。
component.ts
carousels: any = [];
updateSlide(id: number){
this.HomeService.updateSlide(id, this.header, this.subheader).subscribe(slides => {
this.carousels = slides;
console.log(slides)
})
}
使用上面的代码,当我尝试更新没有 _id 的对象时,我希望 upsert 选项创建一个新文档。由于我是 MEAN 的新手,请多多包涵!
编辑
console.log(req.body)
给出了 {header: 'header', subheader 'subheader'}
的结果,这与我数据库中的数据相似。
console.log(results)
return:
result:
{ n: 1,
nModified: 1,
opTime: { ts: [Timestamp], t: 1 },
electionId: 7fffffff0000000000000001,
ok: 1,
operationTime:
Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1571727952 },
'$clusterTime': { clusterTime: [Timestamp], signature: [Object] } },
connection:
Connection {
_events:
[Object: null prototype] {
error: [Function],
close: [Function],
timeout: [Function],
parseError: [Function],
message: [Function] },
_eventsCount: 5,
_maxListeners: undefined,
id: 0,
options:
{ host: 'ds259367.mlab.com',
port: 59367,
size: 5,
minSize: 0,
connectionTimeout: 30000,
socketTimeout: 360000,
keepAlive: true,
keepAliveInitialDelay: 300000,
noDelay: true,
ssl: false,
checkServerIdentity: true,
ca: null,
crl: null,
cert: null,
key: null,
passphrase: null,
rejectUnauthorized: false,
promoteLongs: true,
promoteValues: true,
promoteBuffers: false,
reconnect: true,
reconnectInterval: 1000,
reconnectTries: 30,
domainsEnabled: false,
legacyCompatMode: true,
disconnectHandler: [Store],
cursorFactory: [Function: Cursor],
emitError: true,
monitorCommands: false,
promiseLibrary: [Function: Promise],
clientInfo: [Object],
servers: [Array],
caseTranslate: true,
useNewUrlParser: true,
auth: [Object],
authSource: 'tawebdb',
dbName: 'tawebdb',
socketTimeoutMS: 360000,
connectTimeoutMS: 30000,
retryWrites: true,
useRecoveryToken: true,
readPreference: [ReadPreference],
credentials: [MongoCredentials],
bson: BSON {} },
logger: Logger { className: 'Connection' },
bson: BSON {},
tag: undefined,
maxBsonMessageSize: 67108864,
port: 59367,
host: 'ds259367.mlab.com',
socketTimeout: 360000,
keepAlive: true,
keepAliveInitialDelay: 300000,
connectionTimeout: 30000,
responseOptions:
{ promoteLongs: true,
promoteValues: true,
promoteBuffers: false },
flushing: false,
queue: [],
writeStream: null,
destroyed: false,
hashedName: '09c68a091568e21c31a31a2ad4f8286db4fb6fb3',
workItems: [],
socket:
Socket {
connecting: false,
_hadError: false,
_handle: [TCP],
_parent: null,
_host: 'ds259367.mlab.com',
_readableState: [ReadableState],
readable: true,
_events: [Object],
_eventsCount: 5,
_maxListeners: undefined,
_writableState: [WritableState],
writable: true,
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: null,
_server: null,
timeout: 360000,
[Symbol(asyncId)]: 7,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]:
Timeout {
_called: false,
_idleTimeout: 360000,
_idlePrev: [TimersList],
_idleNext: [TimersList],
_idleStart: 14489,
_onTimeout: [Function: bound ],
_timerArgs: undefined,
_repeat: null,
_destroyed: false,
[Symbol(unrefed)]: true,
[Symbol(asyncId)]: 1899,
[Symbol(triggerId)]: 7 },
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0 },
buffer: null,
sizeOfMessage: 0,
bytesRead: 0,
stubBuffer: null,
ismaster:
{ hosts: [Array],
setName: 'rs-ds259367',
setVersion: 1,
ismaster: true,
secondary: false,
primary: 'ds259367-a.mlab.com:59367',
me: 'ds259367-a.mlab.com:59367',
electionId: 7fffffff0000000000000001,
lastWrite: [Object],
maxBsonObjectSize: 16777216,
maxMessageSizeBytes: 48000000,
maxWriteBatchSize: 100000,
localTime: 2019-10-22T07:05:40.313Z,
logicalSessionTimeoutMinutes: 30,
minWireVersion: 0,
maxWireVersion: 6,
readOnly: false,
ok: 1,
operationTime: [Timestamp],
'$clusterTime': [Object] },
lastIsMasterMS: 227 },
message:
BinMsg {
parsed: true,
raw:
<Buffer f5 00 00 00 00 2c e8 09 04 00 00 00 dd 07 00 00 00 00 00 00 00 e0 00 00 00 10 6e 00 01 00 00 00 10 6e 4d 6f 64 69 66 69 65 64 00 01 00 00 00 03 6f 70 ... >,
data:
<Buffer 00 00 00 00 00 e0 00 00 00 10 6e 00 01 00 00 00 10 6e 4d 6f 64 69 66 69 65 64 00 01 00 00 00 03 6f 70 54 69 6d 65 00 1c 00 00 00 11 74 73 00 01 00 00 ... >,
bson: BSON {},
opts:
{ promoteLongs: true,
promoteValues: true,
promoteBuffers: false },
length: 245,
requestId: 166210560,
responseTo: 4,
opCode: 2013,
fromCompressed: undefined,
responseFlags: 0,
checksumPresent: false,
moreToCome: false,
exhaustAllowed: false,
promoteLongs: true,
promoteValues: true,
promoteBuffers: false,
documents: [ [Object] ],
index: 229,
hashedName: '09c68a091568e21c31a31a2ad4f8286db4fb6fb3' },
modifiedCount: 1,
upsertedId: null,
upsertedCount: 0,
matchedCount: 1 }
您必须检查以下条件:
router.route('carousel/update/:_id').put(function(req, res) {
var id;
if(req.params._id == 'undefined')
{
id = '';. --------> have to careful there should not be any document with id='' in yourDB at any case
} else {
id = ObjectId(req.params._id)
}
db.collection('home').updateOne({"_id": id},
{$set: req.body}, {upsert: true}, (err, results) => {
if (err) throw err;
res.send(results)
console.log(results)
console.log(req.params._id)
});
});
进口,
进口org.mongodb.scala.model.UpdateOptions 像这样尝试::
updateOne(equal("vendor_id", vendorId),
inc("views_count", views),
UpdateOptions().upsert(true))