I'm currently tackling a problem whereas my code allows updates on object data through an *ngFor, but does not allow upsert through the updateOne() function.
Based on other posts, adding the modifier $set should solve the problem, which I have already incorporated with my code but to no avail.
This is my code.
api.js (backend)
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)
});
});
In order to understand how my code works better, this is the angular service connecting my api.js to my component.ts.
service.ts
updateSlide(id: number, newheader: string, subheader: string){
return this.http.put<any[]>('./api/carousel/update/' + id, {'header': newheader, 'subheader': newsubheader})
}
lastly, my component.ts file.
component.ts
carousels: any = [];
updateSlide(id: number){
this.HomeService.updateSlide(id, this.header, this.subheader).subscribe(slides => {
this.carousels = slides;
console.log(slides)
})
}
With the above code, I expect the upsert option to create a new document when I try to update an object without an _id. Please bear with me as I'm a novice with MEAN!
EDIT
console.log(req.body)
gives me a result of {header: 'header', subheader 'subheader'}
which is similar to the data in my database.
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 }
You have to check for conditions as follows:
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)
});
});