Как заставить запрос mongoose возвращать только определенное поле внутри документа, используя Mongoose / MongoDB?

#node.js #mongodb #mongoose

#node.js #mongodb #mongoose

Вопрос:

Я пытаюсь создать менеджер меню, в котором я могу обновлять удалять и создавать как новые пункты меню, так и категории. Мне нужно получить запрос, чтобы возвращать только пункты меню, а не все другие данные категории внутри документа.

Как я могу это сделать?

Это схема:

 {
   Categories:
     name: ffjs,
     id: fhsjd,
     menu_items: [
       item1: {
         name: fhrse,
         ingredients: [jksf,sjdfk,fjd]
       }, ...
    ]
}
 

Я бы хотел, чтобы запрос просто возвращал item1, item2, item3 и так далее, но не могу заставить запрос работать.

Я пробовал:

 Categories.find({"items" : $all})
Categories.find({}).select("items")
 

Я также пытался запрашивать определенные элементы только для тестирования и возвращал только полный документ, такой как :

 Categories.find({"items.name" : "ramen"})
Categories.find({items :{"$elemMatch" : {name: "ramen"}}}, {"items.name" :1})
 

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

1. Не могли бы вы показать, что вы пробовали?

2. Просто обновил его для вас 🙂

Ответ №1:

Решение 1. для его достижения можно использовать агрегированный метод, см. Ниже:

 Categories.aggregate([
    { $match: { $and: [{id: "fhsjd" }, { "items.name" : "ramen" } ] } },
    { $project: { _id: 0, menu_items: 1 } }
  ])
 

Здесь вы можете использовать $match для запроса и $project для фильтра (0: для исключения и 1 для включения).

Решение 2. Чтобы вернуть конкретную запись, используйте ниже:

 Categories.find({ "items.name" : "ramen" }, { items: 1, _id: 0 })
 

Чтобы вернуть все элементы, используйте ниже:

 Categories.find({}, { items: 1, _id: 0 })
 

Надеюсь, одно из решений сработает для вас.

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

1. Проверьте ссылку ниже для дальнейшего понимания Aggregate. mongoosejs.com/docs/api/aggregate.html#aggregate_Aggregate