Обновление Mongoose навалом - как вставить новый объект в массив? - PullRequest
0 голосов
/ 25 августа 2018

У меня есть модель, которая выглядит следующим образом:

fname: String,
lname: String,
rating: [{
    rating: {
      type: Number,
      enum: RATING,
      default: 5
    },
    date: {
      type: Date,
      default: Date.now
    }
}]

Мне нужно выполнить обновления этой модели, добавив новый объект внутри rating array с новыми рейтингами и датами.Я хотел бы использовать метод bulkwrite на Model.collection, чтобы сделать это, потому что мне нужно включить массовые обновления, чтобы мне не приходилось обновлять их одно за другим.

Я создал array bulkUpdateOperations = []и сделал в цикле следующее:

bulkUpdateOperations.push({
      'updateOne': {
        'filter': {'_id': item.id},
        'update': {$push: {rating: {'rating': item.rating, 'date': Date.now}}}
      }
});
Person.collection.bulkWrite(bulkUpdateOperations, {orderd: true, w: 1}, callbackfunc);

Но ничего не обновляется.Я получаю следующий ответ:

...
...
...
insertedCount: 0,
matchedCount: 0,
modifiedCount: 0,
deletedCount: 0,
upsertedCount: 0,
upsertedIds: {},
insertedIds: {},
n: 0 }

Я был бы очень благодарен, если бы кто-то помог мне решить эту проблему.

РЕДАКТИРОВАТЬ

Вотмассив, который я отправляю как тело POST для обновления записей:

[{
    "id": "5b7d4d348151700014d25bdd",
    "rating": 1
},{
    "id": "5b771d10c1e03e1e78b854c2",
    "rating": 1
},{
    "id": "5b771d7ac1e03e1e78b854c8",
    "rating": 1
},{
    "id": "5b7bd75a33f88c1af8585be0",
    "rating": 1
},{
    "id": "5b814a2322236100142ac9f6",
    "rating": 1
}]

А вот пример коллекции в БД

{
    "_id": {
        "$oid": "5b7d4d348151700014d25bdd"
    },
    "status": "ACTIVE",
    "fname": "mr. client",
    "lname": "good client",
    "contact_info": {
        "_id": {
            "$oid": "5b7d4d348151700014d25bde"
        },
        "mobile_no": "0011223344",
        "phone_no": "11223344"
    },
    "handlers": [
        {
            "_id": {
                "$oid": "5b7d4d348151700014d25bdf"
            },
            "date": {
                "$date": "2018-08-22T11:47:00.544Z"
            },
            "id": {
                "$oid": "5b7d45fbfb6fc007d8bdc1f4"
            }
        }
    ],
    "onboarding_date": {
        "$date": "2018-08-22T11:47:00.551Z"
    },
    "rating": [
    {
        "rating": 5,
        "_id": {
            "$oid": "5b814a8e22236100142ac9fc"
        },
        "date": {
            "$date": "2018-08-25T12:22:59.584Z"
        }
    },
    {
        "rating": 3,
        "_id": {
            "$oid": "5b814a8e22236100142ac9fb"
        },
        "date": {
            "$date": "2018-08-25T12:24:46.368Z"
        }
    }
],
    "__v": 0
}

РЕДАКТИРОВАТЬ Добавление upsert: true в качестве фильтра для updateOne создает новый документ со значением rating.

РЕШЕНИЕ

заменяют

'filter': {'_id': item.id},

'filter': {'_id': mongoose.Types.ObjectId(item.id)},

1 Ответ

0 голосов
/ 27 августа 2018

изменение

bulkUpdateOperations.push({
      'updateOne': {
        'filter': {'_id': item.id},
        'update': {$push: {rating: {'rating': item.rating, 'date': Date.now}}}
      }
});

на

bulkUpdateOperations.push({
      'updateOne': {
        'filter': {'_id': mongoose.Types.ObjectId(item.id)},
        'update': {$push: {rating: {'rating': item.rating, 'date': Date.now}}}
      }
});

сработало.Обратите внимание на приведение типов, которое я должен был выполнить вручную в

'filter': {'_id': mongoose.Types.ObjectId(item.id)},

. Я думал, что mongoose автоматически приведёт string к типу ObjectId, но, возможно, потому что я понижаю уровень абстракции с помощьюPerson.collection, мангуста не произвела автоматическое приведение itemId.

Пожалуйста, не стесняйтесь обновлять этот ответ, если кто-нибудь может подтвердить, почему мне пришлось отлить строку вручную.

...