Rafael Hernández
Rafael Hernández

Reputation: 364

filter list of objects mongodb in query with a property

I am using angular,nodejs,mongodb and mongoose-paginate-v2 and mongoose libraries.

I need to filter the list of rooms by availability property.

hoe.component.ts

getRooms(page = 1)
  {
      //  console.log('error');
    this.roomservice.getRooms(page).subscribe(
      response =>
      {

        if(response.rooms)
        {
          this.rooms = response.rooms;
    

          // navegacion de paginación
          this.totalPages = response.totalPages;
          console.log(this.totalPages);

          var number_pages = [];
          for(var i = 1; i <= this.totalPages; i++)
          {
            number_pages.push(i);
          }
          this.number_pages = number_pages;

          if(page >=2)
          {
            this.prev_page = page-1;
          }
          else
          {
            this.prev_page = 1;
          }
          if(page < this.totalPages)
          {
            this.next_page = page+1;
            console.log(page);
          }
          else
          {
            this.next_page = this.totalPages;
          }

        }
        else
        {
         this.router.navigate(['admin/listrooms']);
         console.log('error');
        }
      },
      error =>
      {
        console.log(error);
      }
    );
  }


<div class="row">
    <ul class="list-group">


        <li class="list-group-item" *ngFor="let room of rooms">
            <div class="row">
                <div class="col-sm-2">
                    <div class="" *ngIf="!room.image1 || room.image1 == undefined; else noimage">
                        <img class="img-list" src="{{ url + 'avatar/' + 'no-image.png'  }}" alt="student">
                    </div>
                    <ng-template #noimage>
                        <img class="img-list" src="{{ url + 'avatar/' + room.image1 }}" alt="student">
                    </ng-template>
                </div>
                <div class="col-sm-10">
                    <p class="title-room">Title {{ room.title }}</p>
                    <p class="data-room"> {{ room.location }}</p>
                    <p class="data-room"> {{ room.description | less:[150, '...'] }}</p>
                    <p class="data-room"> Room type {{room.roomtype}}</p>
                    <p>&#163; {{ room.price }} pm</p>
                    <a [routerLink]="['/room', room._id]" class="btn btn-danger">View</a>
                </div>
            </div>
        </li>

    </ul>
</div>
<ul class="pagination">
    <li class="page-item">
        <a class="page-link" [routerLink]="['/admin/listrooms', prev_page]">&laquo;</a>
    </li>
    <li class="page-item" *ngFor="let num of number_pages">
        <a class="page-link" [routerLink]="['/admin/listrooms', num]" href="">{{ num }}</a>
    </li>
    <li class="page-item">
        <a class="page-link" [routerLink]="['/admin/listrooms', next_page]">&raquo;</a>
    </li>
</ul>

nodejs

 getRooms: function(req, res) {

        // Recoger la pagina actual
        if (!req.params.page || req.params.page == 0 || req.params.page == "0" || req.params.page == null || req.params.page == undefined) {
            var page = 1;
        } else {
            var page = parseInt(req.params.page);
        }

        // Indicar las opciones de paginacion
        var options = {
            sort: { date: -1 },
            populate: 'room',
            limit: 5,
            page: page,
            read: {
                tags: [{
                        availability: 'true'
                    }

                ],
            }
        };

        // Find paginado
        Room.paginate({}, options, (err, rooms) => {

            if (err) {
                return res.status(500).send({
                    status: 'error',
                    message: 'Error al hacer la consulta'
                });
            }

            if (!rooms) {
                return res.status(404).send({
                    status: 'error',
                    message: 'No hay libros'
                });
            }


            // Devoler resultado (topics, total de topic, total de paginas)
            return res.status(200).send({
                status: 'success',
                rooms: rooms.docs,
                totalDocs: rooms.totalDocs,
                totalPages: rooms.totalPages
            });

        });

    },

how to filter the list of rooms with availability property = true ??? with a pipe? I saw mongoose documentation but I didnt find nothing useful.

Upvotes: 0

Views: 149

Answers (2)

Rafael Hern&#225;ndez
Rafael Hern&#225;ndez

Reputation: 364

I found other solution using a custom pipe

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'filter'
})
export class FilterPipe implements PipeTransform {

  transform(room: Array<any>, availability: string): Array<any> {
    return room.filter(room => room.availability === 'true');
}
  

}


<li class="list-group-item" *ngFor="let room of rooms | filter:room.availability">

Upvotes: 0

Boris Kukec
Boris Kukec

Reputation: 721

I hope I am not missing something. As stated in https://www.npmjs.com/package/mongoose-paginate-v2

Model.paginate([query], [options], [callback])
Returns promise

Parameters

[query] {Object} - Query criteria. Documentation
[options] {Object}
[select] {Object | String} - Fields to ret

So the first parameter is query object. Put your query there {availability:true}

Room.paginate({availability:true}, options, ...

Upvotes: 1

Related Questions