Попытка использовать разбивку на страницы (10 записей на каждой странице) внутри arrayOfObject

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

У меня есть такие данные

     {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{},{},...n{}]
   }

   {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{},{},...n{}] 
  }

  {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{},{},...n{}] 
  }
  {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{},{},...n{}]
  }
  
  {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{},{},...n{}]
  }
  

То, что я пытаюсь получить здесь, — это ровно 10 записей в каждом вызове, которые я получаю, когда у меня есть такие данные ( assign_id есть ровно 1 запись)

    {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{}]
   }

   {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{}]
   }
   {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{}]
   }
   {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{}]
   }
  {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{}]
  }
  

Постановка задачи

Я хочу ровно 10 записей в каждом вызове, которые включают количество присваиваемых идентификаторов

Например, допустим, у меня есть что-то вроде этого

    {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{},{},{},{},{},{},{},{},{},{}]
   }
   {
    _id:ObjectId("")
    c_id:ObjectId("")
    assign_id:[{},{},{},{},{},{},{}]
   }
  

Теперь, если я запрашиваю, мне нужна только первая запись, потому что в ней установлено ровно 10 записей ( assign_id : Имеет 10 объектов).

Текущий запрос

 db.find(condition)
    .limit(parseInt(count))
     .skip(parseInt(skip))
  

Я также пытаюсь использовать этот код

  db.find(condition,
    {assign_id:{$slice:[parseInt(skip),parseInt(count)]}})
  

Но не сработало, пожалуйста, помогите и простите меня за длинное объяснение.

Ответ №1:

Вы можете сделать это с помощью aggregate() метода,

  • $unwind деконструировать assign_id массив
  • $sort _id или вы можете указать поле, если хотите другое, порядок, который вы можете установить в соответствии с вашим требованием 1 (по возрастанию), -1 (по убыванию),
  • установить $skip и $limit
  • $group по _id , реконструировать assign_id поле
  • $sort с помощью _id вы можете установить в соответствии с вашими требованиями
 db.collection.aggregate([
  { $unwind: "$assign_id" },
  { $sort: { _id: 1 } },
  { $skip: 0 },
  { $limit: 10 },
  {
    $group: {
      _id: "$_id",
      c_id: { $first: "$c_id" },
      assign_id: { $push: "$assign_id" }
    }
  },
  { $sort: { _id: 1 } }
])
  

Игровая площадка