比较mongodb中不同数组中的两个字段

比较mongodb中不同数组中的两个字段,mongodb,Mongodb,我希望有人能在这个话题上帮助我。。。 我有一个基于“Tickets、Tasks和Comentaries(Coms)”结构的mongoDB查询,Tickets数组通常包含Tasks数组和Coms数组,所以我需要将它们展开。我的代码是: db.tickets.aggregate([ {$unwind : "$Coms" }, {$match:{ 'Tsks.Sts': 'Closed', //Status: tasks which are closed

我希望有人能在这个话题上帮助我。。。 我有一个基于“Tickets、Tasks和Comentaries(Coms)”结构的mongoDB查询,Tickets数组通常包含Tasks数组和Coms数组,所以我需要将它们展开。我的代码是:

db.tickets.aggregate([
    {$unwind : "$Coms" },
    {$match:{
        'Tsks.Sts': 'Closed', //Status: tasks which are closed
        'Coms.TicTskId': {$eq: '$Tsks._id'},**
        'Coms.Typ':'CloseTask'

        }},

    {$project:{
        _id:0,
        'Tsks._id':1,
        'Tsks.Sts':1,
        'Tsks.DueDat':1,
        'Nms.Org':1,
        'Nms.Cmp':1,
        'Nms.Wkg':1,    
        'Coms.Typ':1,
        'Coms.Msg': 1,
        'Coms.TicTskId':1
        }},

    {$unwind : "$Tsks" },
    {$match:{$and:[{
        'Tsks.Sts': 'Closed',
        'Tsks.DueDat': {$ne: null},
        'Tsks._id':{$gt:0}
        }]}},

    {$group:
        {_id:{Org:'$Nms.Org',Cmp:'$Nms.Cmp',Wkg:'$Nms.Wkg', DueDate:'$Tsks.DueDat', CurTskId: '$Tsks._id',Type:'$Coms.Typ',Msg: '$Coms.Msg', TicTskId: '$Coms.TicTskId'},
        Total_Closed:{$sum:1},
        }},

    {$project:{
        Total_Closed : 1,
        Comparation: {$cmp: [ '$CurTskId', '$TicTskId']},
        Equal: {$eq: [ "$CurTskId", "$TicTskId"]},
        }},
        { 
             $sort : {CurEntNme:-1,Org: 1,Cmp : 1 ,Wkg: 1 } 
          }

     ])
我试图展示一组需要遵循这些特征的任务:

    "Sts":"Closed", --> Status should be Closed
    'Tsks.DueDat': {$ne: null}, --> Tasks DueDate shouldn't be null
    'Coms.Typ':'CloseTask', --> Coments type should be "CloseTask"
    'Coms.TicTskId' == '$Tsks._id' --> Comments ID should be as same as Tasks ID
我这里的主要问题是,我找不到只获取所有这些分组条件的值的方法,我的意思是,当两个ID都相等时,我看不到除最后一个之外的所有条件。我只想看到所有的iqual,但是这个查询将独立地返回这两个,如果它们相等或不相等。例如,我得到一个结果:

result:
  [item]
     _id:
       Org--> Organization
       Company --> Organization 1
       Wkg --> WKG 1
       DueDate --> 2015-04-10 15:00:00.000Z
       CurTskId --> 7
       Type --> CloseTask
       Msg --> these is close
       TicTskId --> 1
   Total_Closed --> 1
   Comparation --> 0 
   Equal --> true 
比较不应为0,因为CurTskId和TicTskId不是 相似的

Equal不应该是真的,因为CurTskId和TicTskId并不相似

一个票证数据库结构如下所示:

>(1) 12000000        {7 fields}          Object
    _id              12000000             Int64
    TicId            1001                 Int32
    OrgId            2                    Int32
    Sts              Closed               String
   >Nms              {3 fields}           Object
    Cmp              Organization 1       String
    Org              Organization         String
    Wkg              Workgroup            String
  >Tsks              {3 fields}           Object
    _id              1                    Int32
    Sts              Closed               String
    DueDat           2015-04-10           Date
  >Coms              {3 fields}           Object
   TicTskId          7                    Int32
   Typ               CloseTask            String
   Msg               these is close       String
我希望我已经用最好的方式解释了我的问题,如果我的英语不是很好,我很抱歉


提前感谢。

根据您问题中的数据,假设您有以下文档架构和数据:

/* 0 */
{
    "_id" : 12000000,
    "TicId" : 1001,
    "OrgId" : 2,
    "Sts" : "Closed",
    "Nms" : [ 
        {
            "Cmp" : "Organization 1",
            "Org" : "Organization",
            "Wkg" : "Workgroup"
        }
    ],
    "Tsks" : [ 
        {
            "_id" : 1,
            "Sts" : "Closed",
            "DueDat" : ISODate("2015-04-10T00:00:00.000Z")
        }
    ],
    "Coms" : [ 
        {
            "TicTskId" : 1,
            "Typ" : "CloseTask",
            "Msg" : "these is close"
        }
    ]
}
要进行聚合以比较管道中的两个字段是不可能的,但是一种解决方法是在通过操作将数据存储到管道中的其他字段时设置条件,以便可以使用
isComsTsksEqual
字段进行快速真实性检查。进行这种类型的查询会非常快。正如您在上面的测试文档中所看到的,
“Tsks.\u id”
等于“Coms.TicTskId”,因此附加的
isComsTsksEqual
字段变为true,您现在可以在操作员中使用该字段。以下聚合管道演示了这一点:

db.tickets.aggregate([
    {
        "$project": {
            "TicId": 1,
            "OrgId": 1,
            "Sts": 1,
            "Nms": 1,
            "Tsks": 1,
            "Coms": 1,
            "TsksComp": "$Tsks._id"            
        }
    },
    {
        "$project": { 
            "TicId": 1,
            "OrgId": 1,
            "Sts": 1,
            "Nms": 1,
            "Tsks": 1,
            "Coms": 1, 
            "isComsTsksEqual": { 
                "$eq" : [ "$Coms.TicTskId", "$TsksComp" ] 
            }
        }
    },  
    {
        "$unwind": "$Tsks"
    },
    {
        "$unwind": "$Coms" 
    },    
    {
        "$match": {
            "Tsks.Sts": "Closed",             
            "Coms.Typ": "CloseTask",
            "isComsTsksEqual": true
        }
    }
]);
这会回来的

/* 0 */
{
    "result" : [ 
        {
            "_id" : 12000000,
            "TicId" : 1001,
            "OrgId" : 2,
            "Sts" : "Closed",
            "Nms" : [ 
                {
                    "Cmp" : "Organization 1",
                    "Org" : "Organization",
                    "Wkg" : "Workgroup"
                }
            ],
            "Tsks" : {
                "_id" : 1,
                "Sts" : "Closed",
                "DueDat" : ISODate("2015-04-10T00:00:00.000Z")
            },
            "Coms" : {
                "TicTskId" : 1,
                "Typ" : "CloseTask",
                "Msg" : "these is close"
            },
            "isComsTsksEqual" : true
        }
    ],
    "ok" : 1
}
不确定您的聚合目标是什么,但您可以通过集成上述内容来修改当前的聚合管道:

db.tickets.aggregate([
    {
        "$project": {
            "TicId": 1,
            "OrgId": 1,
            "Sts": 1,
            "Nms": 1,
            "Tsks": 1,
            "Coms": 1,
            "TsksComp": "$Tsks._id"            
        }
    },
    {
        "$project": { 
            "TicId": 1,
            "OrgId": 1,
            "Sts": 1,
            "Nms": 1,
            "Tsks": 1,
            "Coms": 1, 
            "isComsTsksEqual": { 
                "$eq" : [ "$Coms.TicTskId", "$TsksComp" ] 
            }
        }
    },  
    {
        "$unwind": "$Tsks"
    },
    {
        "$unwind": "$Coms" 
    }, 
    {
        "$unwind": "$Nms" 
    },
    {
        "$match": {
            "Tsks.Sts": "Closed",             
            "Coms.Typ": "CloseTask",
            "Tsks._id": { "$gt": 0 },
            "Tsks.Sts": "Closed",
            "Tsks.DueDat": { "$ne": null },
            "isComsTsksEqual": true
        }
    },
    {
        "$group": {
            "_id": {
                "Org": "$Nms.Org",
                "Cmp": "$Nms.Cmp",
                "Wkg": "$Nms.Wkg", 
                "DueDate": "$Tsks.DueDat", 
                "CurEntNme": "$OpnPrps.CurEntNme", 
                "CurTskId": "$Tsks._id",
                "Type": "$Coms.Typ",
                "Msg": "$Coms.Msg", 
                "TicTskId": "$Coms.TicTskId"
            },
            "Total_Closed": {
                "$sum": 1
            }
        }
    }/*,
    {
        "$project": {
            "Total_Closed": 1,
            "Comparison": { 
                "$cmp": [ "$CurTskId", "$TicTskId" ]
            },
            "Equal": {
                "$eq": [ "$CurTskId", "$TicTskId" ]
            },
        }
    }*/,
    { 
        "$sort": {
            "CurEntNme": -1,
            "Org": 1,
            "Cmp": 1,
            "Wkg": 1 
        } 
    }
])

欢迎来到StackOverflow!你能试着在你的问题中包含实际的代码而不是图片吗?因为图片中的代码不能被复制粘贴到编辑器中并进行编译以重现问题。在许多其他原因中,通常不建议在此处发布代码图像。因此,图像很大,在移动设备上很难阅读,无法搜索,因此对未来的读者没有用处。你要求我们自愿抽出时间来免费解决你的问题,你应该让我们尽可能轻松地解决你的问题。嗨,chridam,对图片感到抱歉,我已经编辑了我的帖子,试图尽可能地解释我的问题,而不必在第三个网站上传任何图片。我有一个特定的公司数据库,我不能共享,所以我希望有人能够理解我的问题,我从几周前就开始调查这个问题。感谢您的评论和亲切问候。感谢您努力更新问题。我知道您有一个特定的公司数据库,您无法共享,但您是否可以使用一些示例测试文档更新您的问题,这些文档包含测试数据和预期的聚合结果,我们可以复制、测试并提供解决方案或建议?事实上,没有一些测试数据就有点难以理解。在您的更新中,以下字段
Nms
TSK
Coms
显示为
对象
,但在问题的开头您提到它们是数组?你能澄清一下吗?对不起,我只是认为它们像“数组”,因为它们内部有不同的id和组件,但它们是数据库中的对象,当我在Nms、TSK、Coms的开头放一个>时,我的意思是在robomongo中,我可以深入研究这些对象,并且在它们内部有新的项目。出于这个原因,我需要在查询中解开它们以访问此项,我的主要问题是如何比较两个不同对象(Coms.id=Tasks.id)中的两项。非常感谢chridam!最后,“双项目结构”运行良好,现在我只得到相同任务和Coms ID的结果。我得到的结果不如预期,但这是另一件我需要调查的事情。再次感谢您抽出时间:)