节点 Mongodb 驱动程序:聚合结果不同

Node Mongodb Driver: different result on aggregate

你好吗? 我在我的项目中进行聚合时遇到问题,我的聚合结果在 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 个对象。你能帮助我吗?谢谢

编辑 节点:

第一个匹配项根据我的过滤器在 GraphQL 上下文中为公司创建 ObjectId 匹配项。

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 这是 pipeline

console.dir (with {depth: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': [] } } }
 ]

我想我找到了解决方案,文档是用以下属性创建的:

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

但有时用户数组在 mongodb 中未定义,所以我用 { '$ne': [ '$$step.users', undefined ] } 我认为 JS undefined 与 mongodb undefined 不同,所以我用一个空的用户数组初始化了所有步骤,并删除了这个验证并成功了! –