space2pacman
@space2pacman
Просто царь.

Как упростить запрос к БД?

Структура
Коллекция: counters
{
  "objectId": {
    "last": 5,
    "start": 268435456,
    "end": 2147483647
  }
}


Запрос данных:
const data = await this._db.collection('counters').findOne(
  {
    "objectId": {
      $exists : true
    }
  }
);


Есть способ сразу получить значения объекта objectId?

Потому что сейчас обращение идет к data['objectId'].last

И есть ли короче способ на обновление данных?
await this._db.collection('counters').updateOne(
  {
    "objectId": { 
      $exists : true 
    }
  },
  {
    $set: {
      "objectId.last": objectId.last + 1
    }
  }
);
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
rqdkmndh
@rqdkmndh
Web-разработчик
Да, существует способ упростить запрос и сразу получить значения объекта objectId при помощи проекции в MongoDB. Проекция позволяет вам указать, какие поля должны возвращаться в результате запроса. Чтобы получить только объект objectId, можно использовать второй аргумент findOne, который определяет проекцию:
const data = await this._db.collection('counters').findOne(
  { "objectId": { $exists: true } },
  { projection: { _id: 0, objectId: 1 } }
);

// Теперь data уже будет содержать только 'objectId',
// и вы можете обращаться так: data.objectId.last

Также, если вы хотите обновить данные более эффективно, вы можете использовать оператор $inc, который инкрементирует поле на указанное значение:
await this._db.collection('counters').updateOne(
  { "objectId": { $exists : true } },
  { $inc: { "objectId.last": 1 } } // инкрементируем поле 'last' объекта 'objectId' на 1
);

Использование $inc более оптимально, поскольку оно не требует чтения текущего значения last и его последующей инкрементации в приложении. Операция инкремента выполняется непосредственно в базе данных.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы