Node.js 节点Mongodb驱动程序:聚合上的不同结果
你好吗? 我在我的项目中进行聚合时遇到问题,我在Robo3T和Node中的聚合结果不同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: {
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之外的所有管道,如果这只匹配一个文档,则查看结果,然后确定,然后添加下一个管道,依此类推。