как увеличить поле в массиве объектов после его нахождения (с помощью findOne ()) и перед его сохранением? - PullRequest
0 голосов
/ 12 октября 2018

Я хочу обновить объект внутри массива схем без необходимости делать два запроса к базе данных.В настоящее время я увеличиваю поле с помощью findOneAndUpdate (), если объект уже существует, и он работает нормально.но в случае, если объект не существует, я должен сделать еще один запрос, используя update (), чтобы выдвинуть новый объект и сделать его доступным для последующих приращений.

Я хочу иметь возможность сделать только один запрос (например, findOne ()), чтобы получить пользователя, а затем увеличивать поле, только если объект существует в массиве, и если нет, я бы вместо этого хотел выдвинуть новый объект,затем сохраните документ.таким образом я делаю только одно чтение / запрос из базы данных вместо двух.

теперь это функция:

  async addItemToCart(body, userId) {
const itemInDb = await Model.findOneAndUpdate(
  {
    _id: userId,
    'cart.productId': body.productId,
  },
  { $inc: { 'cart.$.count': 1 } }
);
if (itemInDb) return true;

const updated = await Model.update(
  { _id: userId },
  { $push: { cart: body } }
);
if (updated.ok !== 1)
  return createError(500, 'something went wrong in userService');
return true;
}

, что я хотел бы сделать:

  async addItemToCart(body, userId) {
const itemInDb = await Model.findOne(
  {
    _id: userId,
    'cart.productId': body.productId,
  }
);
if (itemInDb) {
  /**
   * 
   * increment cart in itemInDb then do itemInDb.save()  <<------------
   */
} else {
  /**
   * push product to itemInDb then save
   */
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Вы можете использовать upsert .

upsert определяется как операция, которая создает новый документ, когда ни один документ не соответствует критериям запроса, а если соответствует, тоэто обновляет документ.Это опция для команды обновления.Если вы выполняете команду, подобную приведенной ниже, она работает как обновление, если есть запрос на сопоставление документа или как вставка с документом, описанным обновлением как аргумент.

Пример : я просто привожу простой пример.Вы должны изменить его в соответствии с вашими требованиями.

db.people.update(
   { name: "Andy" },
   {
      name: "Andy",
      rating: 1,
      score: 1
   },
   { upsert: true }
)

Итак, в приведенном выше примере, если найдены люди с именем Andy , будет выполнена операция обновления.Если нет, то он создаст новый документ.

0 голосов
/ 12 октября 2018

Вы можете попробовать findOneAndUpdate с помощью upsert.

upsert: true, а затем создать данные, если их нет в БД.

Model.findOneAndUpdate(
  {
    _id: userId,
    'cart.productId': body.productId,
  },
  { $inc: { 'cart.$.count': 1 } },
 {
     upsert: true,
   }
)

Использовать $set и $inc в одном запросе.

try {
  db.scores.findOneAndUpdate(
    {
      _id: userId,
      'cart.productId': body.productId,
    },
     { $set: { "cart.$.productName" : "A.B.C", "cart.$.productPrice" : 5}, $inc : { "cart.$.count" : 1 } },
     { upsert:true, returnNewDocument : true }
  );
  }
  catch (e){
     //error
  }

ссылка Ссылка: здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...