Драйвер узла Mongodb: другой результат в совокупности - PullRequest
2 голосов
/ 01 февраля 2020

как дела? У меня проблемы с выполнением агрегации в моем проекте, мой результат агрегации отличается в Robo3T и Node.

db.getCollection('companies').aggregate([
    { '$match': { _id: { '$eq': ObjectId("5e30a4fe11e6e80d7fb544a4")} } },
    { $unwind: '$jobVacancies' },
    {
      $project: {
          jobVacancies: {
              _id: 1,
              name: 1,
              city: 1,
              openingDate: 1,
              closingDate: 1,
              createdAt: 1,
              quantity: 1,
              steps: {
                  $filter: {
                      input: '$jobVacancies.steps',
                      as: 'step',
                      cond: {
                          $and: [
                              { $eq: ['$$step.order', 0] },
                              { $ne: ['$$step.users', undefined] },
                              { $ne: ['$$step.users', null] },
                              { $ne: ['$$step.users', []] },
                          ],
                      },
                  },
              },
          },
      },
  },
  { $match: { 'jobVacancies.steps': { $ne: [] } } },
])

В Robo3T это возвращает 1 объект, но в Node (та же агрегация) получается 6 объектов , Вы можете помочь мне? Спасибо

EDIT Nodejs:

Первое совпадение создает соответствие ObjectId для компании в контексте GraphQL на основе моего фильтра.

const companies = await this.MongoClient.db
            .collection('companies')
            .aggregate([
                {
                    $match: await this.getFilterObject(
                        filters.filter(f => !f.field.includes('$$jobVacancy') && !f.field.includes('StepOrder')),
                    ),
                },
                { $unwind: '$jobVacancies' },
                {
                    $project: {
                        jobVacancies: {
                            _id: 1,
                            name: 1,
                            city: 1,
                            openingDate: 1,
                            closingDate: 1,
                            createdAt: 1,
                            quantity: 1,
                            steps: {
                                $filter: {
                                    input: '$jobVacancies.steps',
                                    as: 'step',
                                    cond: {
                                        $and: [
                                            { $eq: ['$$step.order', order] },
                                            { $ne: ['$$step.users', undefined] },
                                            { $ne: ['$$step.users', null] },
                                            { $ne: ['$$step.users', []] },
                                        ],
                                    },
                                },
                            },
                        },
                    },
                },
                { $match: { 'jobVacancies.steps': { $ne: [] } } },
            ])
            .toArray();

РЕДАКТИРОВАТЬ 3 Это результат console.dir (с {deep: null}) конвейера

[
   {
     '$match': {
       _id: {
         '$eq': ObjectID {
           _bsontype: 'ObjectID',
           id: Buffer [Uint8Array] [
              94,  48, 164, 254,  17,
             230, 232,  13, 127, 181,
              68, 164
           ]
         }
       }
     }
   },
   { '$unwind': '$jobVacancies' },
   {
     '$project': {
       jobVacancies: {
         _id: 1,
         name: 1,
         city: 1,
         openingDate: 1,
         closingDate: 1,
         createdAt: 1,
         quantity: 1,
         steps: {
           '$filter': {
             input: '$jobVacancies.steps',
             as: 'step',
             cond: {
               '$and': [
                 { '$eq': [ '$$step.order', 0 ] },
                 { '$ne': [ '$$step.users', undefined ] },
                 { '$ne': [ '$$step.users', null ] },
                 { '$ne': [ '$$step.users', [] ] }
               ]
             }
           }
         }
       }
     }
   },
   { '$match': { 'jobVacancies.steps': { '$ne': [] } } }
 ]

1 Ответ

0 голосов
/ 01 февраля 2020

Я думаю, что нашел решение, документ создан со свойствами:

jobVacancies: { 
    steps: { 
        users: [] 
    } 
}

Но иногда массив пользователей не определен в mongodb, поэтому я проверяю с помощью { '$ne': [ '$$step.users', undefined ] } Я думаю, JS undefined отличается затем mongodb undefined, поэтому я инициализировал все шаги с пустым массивом пользователей, удалил эту проверку и работал! -

...