Как использовать агрегат в пн goosejs с этим примером - PullRequest
0 голосов
/ 25 февраля 2020

Я здесь, чтобы задать вопрос о агрегатной функции mon go для достижения этого примера.

Сценарий

У меня есть 3 Пн go Схема, т. Е. Дом, семья и образование, которые как:

House: {
_id: ObjectId,
state: Number,
houseNumber: Number
}

Family: {
    _id: ObjectId,
    houseId: ObjectId,//ref: house
    name: String,
    gender: String
}

Education: {
    _id: ObjectId,
    familyId: ObjectId,//ref: Family
    level: String, //might be one of ["primary","secondary","higher_secondary"]
}

Ожидаемый результат :

{
    state1: {
        primary: {
            male: 3,
            female: 4   
        },
        secondary: {
            male: 4,
            female: 8
        }
    },
    state2: {
        primary: {
            male: 5,
            female: 4   
        },
        secondary: {
            male: 4,
            female: 6
        }
    }
}

Я хочу сгруппировать все уровни образования по полу, а затем по приходу.

Что я сделал:

I Я новичок ie в понедельник go мире и недавно перешел с sql на нет- sql. Я сделал это:

let edu = await Education.find({level: "primary"}).populate({
      path: "family",
      match: {gender: "male"},
      select: "house",
      populate: {
        path: "house",
        match: {state: 1},
        select: "_id"
      }
    });
let count = (await edu.filter(each => !isEmpty(each.family) && !isEmpty(each.family.house)).length) || 0;

Делая это, я получаю счет члена мужского пола, который изучал начальную школу из состояния 1., но я не могу позволить себе вызывать эту функцию по одному для каждой информации.

В соответствии с запросом данные выборки:

house = [
  {
    _id: AA1,
    state: 1,
    houseNumber: 101
  },
  {
    _id: AA2,
    state: 1,
    houseNumber: 102
  },
  {
    _id: AA3,
    state: 2,
    houseNumber: 201
  }
];

family = [
  {
    _id: BB1,
    houseId: AA1, //ref: house
    name: "John",
    gender: "male"
  },
  {
    _id: BB2,
    houseId: AA1, //ref: house
    name: "Solena",
    gender: "female"
  },
  {
    _id: BB3,
    houseId: AA2, //ref: house
    name: "Efrain",
    gender: "male"
  },
  {
    _id: BB4,
    houseId: AA3, //ref: house
    name: "Naruto",
    gender: "male"
  }
];


education = [
  {
    _id: CC1,
    familyId: AA1, //ref: Family
    level: "primary"
  },
  {
    _id: CC2,
    familyId: AA2, //ref: Family
    level: "secondary"
  },
  {
    _id: CC3,
    familyId: AA3, //ref: Family
    level: "primary"
  },
  {
    _id: CC4,
    familyId: AA4, //ref: Family
    level: "secondary"
  }
];

PS Ожидаемый вывод не соответствует выводу данных выборки. И ObjectId был заменен какой-то уникальной ссылкой.

Есть ли здесь какой-нибудь вывод, guyz?

1 Ответ

1 голос
/ 28 февраля 2020

Вы можете использовать запрос агрегации ниже в версии 4.x.

Запросить семейную коллекцию и присоединиться к образовательной коллекции, чтобы получить уровень, а затем присоединиться к домашней коллекции, чтобы получить состояние.

Как только у вас есть все группы данных по состоянию, уровню и полу для подсчета всех совпадений, за которыми следуют другие группы для форматирования результата. Последний этап преобразования агрегированного результата в собственный документ.

Последние две группы форматируют результаты предыдущего этапа в документ с именованным значением ключа. Первая группа, чтобы отформатировать результаты в пол и подсчитать сгруппированы по штатам. Вторая группа для форматирования ранее объединенного пола и подсчета с ключом образования.

Наконец, замените этап root, чтобы отформатировать объединенный пол, счет и образование, выполните c с ключом состояния.

Также для ясности добавлен вывод после каждого этапа.

db.family.aggregate(
[
  {"$lookup":{
    "from":"education",
    "localField":"_id",
    "foreignField":"familyId",
    "as":"education"
  }},
  {"$unwind":"$education"},
  {"$lookup":{
    "from":"house",
    "localField":"houseId",
    "foreignField":"_id",
    "as":"state"
  }},
  {"$unwind":"$state"},
  {"$group":{
    "_id":{
      "state":"$state.state",
      "education":"$education.level",
      "gender":"$gender"
    },
    "count":{"$sum":1}
  }},//{"_id":{"state" :1,"education" :"secondary","gender":"female"},"count":1}
  {"$group":{
    "_id":{"state":"$_id.state","education":"$_id.education"},
    "gandc":{"$mergeObjects":{"$arrayToObject":[[["$_id.gender","$count"]]]}}
  }},//{"_id":{"state":1,"education":"primary"},"gandc":{"male":2}}
  {"$group":{
    "_id":"$_id.state",
    "egandc":{"$mergeObjects":{"$arrayToObject":[[["$_id.education","$gandc"]]]}}
  }},//{"_id":1,"egandc":{"primary":{"male":2},"secondary":{"female":1}}}
  {"$replaceRoot":{"newRoot":{"$arrayToObject":[[[{"$toString":"$_id"},"$egandc"]]]}}} ])
])
//{"1":{"primary":{"male" : 2 },"secondary":{"female":1}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...