How to return a list of specific fields in an Aggregation in Mongodb

Asked

Viewed 20 times

1

Hello I am creating a generic query according to the code below:

// dados de exemplo em uma coleção "test" do mongodb
const test = [
  { "name": "foo", age: 2 },
  { "name": "bar", age: 16 },
  { "name": "bin", age: 53 },
]

// tipo esperado na coleção
type Test = {
  name: string
  age: number
}

// resultado esperado nas buscas tipo "search"
type SearchResult<T = any> = {
  total: number
  limit: number
  offset: number
  items: Partial<Array<T>>
}

// aggregation que estou montando
async function searchTest({
  // aqui entra a consulta de dados
  where = {},
  // tamanho maximo da paginacao
  limit = 50,
  // inicio da paginacao
  offset = 0,
  // a ordenacao que sera aplicada
  sort,
  // os campos que devem retornar nos items
  fields
}): Promise<SearchResult<Test>> {
  const agg = [
    // filtra os dados
    { $match: where },
    // se tiver um sort ele ordena
    sort && { $sort: sort },
    // quebra a consulta em 2 pra achar a quantidade total
    // de itens atendidas pela query
    {
      $facet: {
        total: [
          { $count: "total" },
        ],
        items: [
          // pula x itens no offset pra paginação
          { $skip: offset },
          // pega x itens no limit pra paginação
          { $limit: limit },
          // aqui preciso filtrar os campos que forem enviados
          // se forem enviados...
          fields && { /* ???*/ }
        ].filter(x => x)
      }
    }
  ].filter(x => x)

  return await db.getCollect

I need to know how to filter the fields that will be returned to the objects dynamically... If we are in SQL could do something like:

const fields = 'foo, age'
const sql = `SELECT ${fields}` FROM test`

Could someone help me?

1 answer

0


I believe it would be so:

const fieldsObj: { [key: string]: number} = {}; 
fields.forEach((field)=> fieldsObj[field] = 1)

const agg = [ ...

    items: [  
       // pula x itens no offset pra paginação{ $skip: offset },
       // pega x itens no limit pra paginação
       { $limit: limit },
       // aqui preciso filtrar os campos que forem enviados
       // se forem enviados...
       fields && {$project : fieldsObj },
    ].filter(x => x)

I’ve never used Mongodb much, more looking at documentation and this question, I believe the key $project and used to describe Fields that Voce wants to be returned. I’m also assuming that the field fields that Voce receives is a Array.

  • 1

    good! really this reslve my problem of the fields q want to return

Browser other questions tagged

You are not signed in. Login or sign up in order to post.