Получить все поля с поиском по конкретному полю mon go узла - PullRequest
1 голос
/ 06 апреля 2020

Итак, у меня есть две разные коллекции: одна - пользователи , а вторая - продукт , я хочу найти продукт по полю имени, и он должен предоставить все данные пользователю сведения из коллекции пользователей.

Фрагмент кода:

app.get('/api/searchProduct/:name', function(request, response) {
    search = request.params.name;
    product.aggregate([
        { "$project": { "supplierID": { "$toObjectId": "$supplierID" } } },
        { $lookup: {
            "localField": "supplierID",
            "from": "users",
            "foreignField": "_id",
            "as": "userDetails"
        }},

        ], function(error, data) {
            if(error) {
                return response.send(error);
            } else {
                response.status(200).json({
                    status: 'success',
                    data: data,
                })
                console.log(JSON.stringify(data));
            }
        })
    })

Фактический JSON Результат:

{
  "status": "success",
  "data": [
    {
      "_id": "5e89b936e20452a419ccbcad",
      "supplierID": "5e89b916e20452a419ccbcac",
      "userDetails": [

      ]
    },
    {
      "_id": "5e89bc5ee20452a419ccbcb0",
      "supplierID": "5e89bc48e20452a419ccbcae",
      "userDetails": [
        {
          "_id": "5e89bc48e20452a419ccbcae",
          "timestamp": "2020-04-05T10:37:09.582Z",
          "name": "Mohamma Junaid Raza",
          "email": "junaidraza10896@gmail.com",
          "password": "Iamjunaidr@10896",
          "contact": "",
          "userType": "",
          "profilePhoto": "",
          "__v": 0
        }
      ]
    },
    {
      "_id": "5e89c12bf312e7a5cdfe2e9e",
      "supplierID": "5e89bc48e20452a419ccbcae",
      "userDetails": [
        {
          "_id": "5e89bc48e20452a419ccbcae",
          "timestamp": "2020-04-05T10:37:09.582Z",
          "name": "Mohamma Junaid Raza",
          "email": "junaidraza10896@gmail.com",
          "password": "Iamjunaidr@10896",
          "contact": "",
          "userType": "",
          "profilePhoto": "",
          "__v": 0
        }
      ]
    },

  ]
}

Мне нужны полные данные (поля) продукта с поисковым запросом в поле имени, отображаемом под данными продукта:

enter image description here

1 Ответ

1 голос
/ 06 апреля 2020

Попробуйте этот код:

app.get('/api/searchProduct/:name', function(request, response) {
    search = request.params.name;
    product.aggregate([
        {$match : {name : search}},
        { "$addFields": { "supplierID": { "$toObjectId": "$supplierID" } } },
        { $lookup: {
            "localField": "supplierID",
            "from": "users",
            "foreignField": "_id",
            "as": "userDetails"
        }},
        { "$addFields": { "supplierID": { "$toString": "$supplierID" } } }
        ], function(error, data) {
            if(error) {
                return response.send(error);
            } else {
                response.status(200).json({
                    status: 'success',
                    data: data,
                })
                console.log(JSON.stringify(data));
            }
        })
    })

Проблемы:

  1. Вы делаете $ проект в качестве первого этапа, который будет оставьте только два поля, преобразованные supplierID & _id для каждого do c в коллекции. Вместо этого используйте $ addFields , который сохранит все поля в do c и заменит строковое значение supplierID на ObjectId() и наоборот в конце.
  2. Вы не сделали отфильтровал вашу коллекцию для указания c do c, где имя совпало с вводом, используйте $match для фильтрации документов.
...