Как получить значение одного поля нескольких документов в коллекции MongoDB? - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть коллекция документов со следующей схемой:

{ 
    "_id" : ObjectId("8dcaac2eb104c2133d66f144"), 
    "Shape" : "circle",  
    "Color" : "blue" 
},

Моя цель - динамически извлекать значение определенного поля для диапазона документов. Ответ на запрос значения Color из 3 документов должен выглядеть следующим образом:

{
    "blue"
    "green"
    "yellow"
}

Я использую Mongodb и nodejs, вот мой код:

var field = req.params.field
var field_option = {};
field_option[field] = 1;

db.collection.find({_id: {$gte: first, $lt: last}}, field_option).toArray(function(err, data){
    if(err || !data) throw err;
    res.json(data);
});

Однаковывод неправильный:

[
    {
        "_id": "8dcaac2eb104c2133d66f144",
        "Shape" : "circle",  
        "Color" : "blue" 
    },
    {
        "_id": "8dcaac2eb104c2133d66f145",
        "Shape" : "square",  
        "Color" : "green" 
    },
    {
        "_id": "8dcaac2eb104c2133d66f146",
        "Shape" : "triangle",  
        "Color" : "yellow" 
    }

]

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Неправильный объект, который вы хотите

{
  "blue"
  "green"
  "yellow"
}

Вам нужно управлять результатом в массиве.

[
  "blu",
  "green",
  "yellow",
]

Там 2 способа, используя агрегирование или манипулирование результатом

1 способ:

db.collection.aggregate([
  { $match: { _id: {$gte: first, $lt: last} }},
  { $group: { _id: "1", fields: { $push: { $concat: field }}}}
]);

возвращает объект с позициями_id и поля с результатом. Поскольку конвейер агрегации выполняет сопоставление и группу после значения defautl и помещает в массив нужное поле

2 way: Управление результатом с использованием карты.

db.collection.find({_id: {$gte: first, $lt: last}}, field_option).toArray(function(err, data){
    if(err || !data) throw err;
    res.json(data.map(item => (item[field]);
});

Возвращает нужный вам массив, данные - это массив объектов, а карта функций используется для реструктуризации объекта в строку.

Второй способ проще, чем первый, и эффектменьше кода.

0 голосов
/ 04 ноября 2019

Чтобы получить это как ответ, вы должны манипулировать результатами после получения данных из запроса монго.

var data = res.json(data), endResult = [];
for(key in data) {
    endResult[key] = data[key]["Color"];
}
return endResult; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...