Mongodb upsert опция с updateOne () не работает - PullRequest
0 голосов
/ 22 октября 2019

В настоящее время я занимаюсь проблемой, в то время как мой код позволяет обновлять данные объекта через * ngFor, но не разрешает upsert через функцию 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 на мой component.ts.

service.ts

updateSlide(id: number, newheader: string, subheader: string){
   return this.http.put<any[]>('./api/carousel/update/' + id, {'header': newheader, 'subheader': newsubheader})
}

наконец, мой компонент.ts файл.

component.ts

carousels: any = [];

updateSlide(id: number){
  this.HomeService.updateSlide(id, this.header, this.subheader).subscribe(slides => {
this.carousels = slides;
console.log(slides)

})
}

С помощью приведенного выше кода я ожидаю, что опция upsert создаст новый документ, когдаЯ пытаюсь обновить объект без _id. Пожалуйста, потерпите меня, так как я новичок со 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 }

1 Ответ

0 голосов
/ 22 октября 2019

Вы должны проверить следующие условия:

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)
  });
});
...