Node.js 节点Mongodb驱动程序:聚合上的不同结果

Node.js 节点Mongodb驱动程序:聚合上的不同结果,node.js,mongodb,aggregation-framework,node-mongodb-native,Node.js,Mongodb,Aggregation Framework,Node Mongodb Native,你好吗? 我在我的项目中进行聚合时遇到问题,我在Robo3T和Node中的聚合结果不同 db.getCollection('companies').aggregate([ { '$match': { _id: { '$eq': ObjectId("5e30a4fe11e6e80d7fb544a4")} } }, { $unwind: '$jobVacancies' }, { $project: { jobVacancies: {

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

编辑 Nodejs:

第一个匹配基于我的过滤器在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 这是管道的console.dir(带有{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',未定义]}

我认为JS undefined与mongodb undefined不同,所以我用一个空的用户数组初始化了所有步骤,并删除了这个验证并成功了

请发布Nodejs代码。顺便说一句:
{'$match':{{u id:{'$eq':ObjectId(“5e30a4fe11e6e80d7fb544a4”)}}
将始终返回1document@Valijon我想筛选此文档中的职位空缺,这就是为什么$matches是this.getFilterObject(filters.filter(f=>!f.field.includes(“$$JobSpance”)&&&!f.field.includes('StepOrder'))返回{u id:{$eq':ObjectId(“5e30a4fe11e6e80d7fb544a4”)或者什么的else@MohammadFaisal是,返回aggregate@EduardoSantos我认为您需要一步一步地查看管道。首先,删除除$match之外的所有管道,如果这只匹配一个文档,则查看结果,然后确定,然后添加下一个管道,依此类推。