как запросить mongodb с помощью findOne и исключить некоторые вложенные поля в массиве

#node.js #mongodb #mongoose #mongodb-query #aggregation-framework

Вопрос:

Я новичок в MongoDB, хотя и использовал MySQL.

В моей пользовательской коллекции есть пользовательские данные с приведенной ниже формой —

Я создаю api in nodejs , который извлекает все данные данного пользователя, но должен исключить transactions поле из каждого типа данных. мой api получения данных: localhost:5000/api/users/id/:id/data

Пожалуйста, помогите мне написать запрос. Я уже создал api для выборки всех пользователей, создания пользователя, обновления пользователя, но я застрял только на этом. Я также пытался использовать aggregate, но он возвращает все данные, включая транзакции. Моя попытка —

 getUserData = async (req, res) => {
    const { id } = req.params;
    try {
      const userData = await UserModel.findById(id).aggregate([
        { $project: { "data.v.transactions": 0 } }
      ]);
      if (!userData ) res.status(400).json({ success: false, message: `No data found` });
      res.status(200).send(userData);
    } catch (error) {
      console.error(error);
      res.status(400).send({ status: false, error });
    }
  }
 

Я использую mongoose пакет в своем приложении nodejs.

Один объект пользователя в коллекции пользователей —

 {
  "_id": "615d6a2afabf089b94a116e6",
  "email": "john@doe.com",
  "data": {
    "TYPE_1": [
      {
        "type": "type_1",
        "transactions": {
          "endDate": "2020-09-17T14:25:33.440Z",
          "startDate": "2019-04-11T11:39:57.153Z",
          "transaction": [
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            }
          ]
        },
        "profile": {
          "full_name": "John Doe"
        },
        "summary": {
          "note": "Lorem Ipsum"
        }
      },
      {
        "type": "type_1",
        "transactions": {
          "endDate": "2020-09-17T14:25:33.440Z",
          "startDate": "2019-04-11T11:39:57.153Z",
          "transaction": [
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            }
          ]
        },
        "profile": {
          "full_name": "John Doe"
        },
        "summary": {
          "note": "Lorem Ipsum"
        }
      },
      {
        "type": "type_1",
        "transactions": {
          "endDate": "2020-09-17T14:25:33.440Z",
          "startDate": "2019-04-11T11:39:57.153Z",
          "transaction": [
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            }
          ]
        },
        "profile": {
          "full_name": "John Doe"
        },
        "summary": {
          "note": "Lorem Ipsum"
        }
      }
    ],
    "TYPE_2": [
      {
        "type": "type_2",
        "transactions": {
          "endDate": "2020-09-17T14:25:33.440Z",
          "startDate": "2019-04-11T11:39:57.153Z",
          "transaction": [
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            }
          ]
        },
        "profile": {
          "full_name": "John Doe"
        },
        "summary": {
          "note": "Lorem Ipsum"
        }
      },
      {
        "type": "type_2",
        "transactions": {
          "endDate": "2020-09-17T14:25:33.440Z",
          "startDate": "2019-04-11T11:39:57.153Z",
          "transaction": [
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            }
          ]
        },
        "profile": {
          "full_name": "John Doe"
        },
        "summary": {
          "note": "Lorem Ipsum"
        }
      },
      {
        "type": "type_2",
        "transactions": {
          "endDate": "2020-09-17T14:25:33.440Z",
          "startDate": "2019-04-11T11:39:57.153Z",
          "transaction": [
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            },
            {
              "mode": "A",
              "type": "AB",
              "amount": "0"
            }
          ]
        },
        "profile": {
          "full_name": "John Doe"
        },
        "summary": {
          "note": "Lorem Ipsum"
        }
      }
    ]
  },
  "createdAt": "2021-10-06T09:19:39.378Z",
  "updatedAt": "2021-10-06T09:19:39.378Z",
  "__v": 0
}
 

Комментарии:

1. какого результата вы добиваетесь?

2. @ТобиасС. весь объект пользователя из коллекции без поля транзакции.

Ответ №1:

Может быть, попробуем это сделать:

 const userData = await UserModel.find({}, { 
    "data.TYPE_1.transactions" : 0, 
    "data.TYPE_2.transactions" : 0  
})
 

Комментарии:

1. но мне нужно исключить транзакции из каждого типа, а не только из Type_1

2. существуют ли только type_1 и type_2 ?

3. @ТобиасС. Вместо того, чтобы игнорировать поля, которые вам не нужны, вы должны вместо этого выбрать поля, которые вам нужны. Это гарантирует, что, если вы добавите новые поля, вы не выберете их непреднамеренно.

4. Тобиас, может быть много типов, я просто издевался над этим. @MikeEason Пожалуйста, предоставьте универсальное решение, либо исключив ненужные поля, либо выбрав только нужные поля.