【问题标题】:MongoDB: Regroup by two field with different valueMongoDB:按两个具有不同值的字段重新组合
【发布时间】:2018-02-22 21:49:20
【问题描述】:

我在 Typescript 中创建了一个 nodejs 应用程序。 我想通过指定 one_id 值的两个字段“one_id”和“two_id”对文档进行分组。

这是我收藏中的数据:

{  
   "_id":"5a8b2953007a1922f00124fd",
   "one_id":"307973260186877954",
   "two_id":"415228402765660181"
}
{  
   "_id":"5a8b29a3007a1922f00124fe",
   "one_id":"415228402765660181",
   "two_id":"307973260186877954"
}
{  
   "_id":"5a8c119bf6ba49302c3ef67e",
   "one_id":"394199132195127306",
   "two_id":"270131587092316161"
}
{  
   "_id":"5a8c11a4f6ba49302c3ef67f",
   "one_id":"270131587092316161",
   "two_id":"394199132195127306"
}
{  
   "_id":"5a8c33132a182308a836bc1c",
   "one_id":"307973260186877954",
   "two_id":"397036401075552256"
}
{  
   "_id":"5a8c33242a182308a836bc1d",
   "one_id":"397036401075552256",
   "two_id":"307973260186877954"
}

如果我想得到 one_id="307973260186877954" 的对,例外的结果是:(必须有另一个文档具有“反转”字段内容)

{  
   "_id":"5a8b2953007a1922f00124fd",
   "one_id":"307973260186877954",
   "two_id":"415228402765660181"
}
{  
   "_id":"5a8b29a3007a1922f00124fe",
   "one_id":"415228402765660181",
   "two_id":"307973260186877954"
}
{  
   "_id":"5a8c33132a182308a836bc1c",
   "one_id":"307973260186877954",
   "two_id":"397036401075552256"
}
{  
   "_id":"5a8c33242a182308a836bc1d",
   "one_id":"397036401075552256",
   "two_id":"307973260186877954"
}

我不知道你是否理解我。

谢谢,希望有人能理解我!

【问题讨论】:

    标签: node.js mongodb typescript


    【解决方案1】:

    您可以使用$lookup 自行加入行并在匹配时输出文档,使用$project 排除已加入的字段。

    db.col.aggregate([
      {"$lookup":{
        "from":col,
        "localField":"one_id",
        "foreignField":"two_id",
        "as":"onetwo"
      }},
      {"$lookup":{
        "from":col,
        "localField":"two_id",
        "foreignField":"one_id",
        "as":"twoone"
      }},
      {"$match":{"onetwo.0":{"$exists":true}, "twoone.0":{"$exists":true}}},
      {"$project":{"onetwo":0,"twoone":0}}
    ])
    

    【讨论】:

    • 我更新了问题,看看我的期望和我的收藏。
    • { _id: 5a8b2953007a1922f00124fd, one_id: '307973260186877954', two_id: '415228402765660181' } { _id: 5a8b29a3007a1922f00124fe, one_id: '415228402765660181', two_id: '307973260186877954' } { _id: 5a8c1068f6ba49302c3ef67d, one_id: '307973260186877954', two_id: '394199132195127306' } { _id: 5a8c33132a182308a836bc1c, one_id: '307973260186877954', two_id: '397036401075552256' } { _id: 5a8c33242a182308a836bc1d, one_id: '397036401075552256', two_id: '307973260186877954' }
    • 工作,但不应显示{ _id: 5a8c1068f6ba49302c3ef67d, one_id: '307973260186877954', two_id: '394199132195127306' }
    • 我想我明白了。你能检查更新的答案吗?
    • 谢谢!有效!我刚刚添加了{ $match: { $or: [{ one_id: userM.id }, { two_id: userM.id }] } }, 非常感谢您的帮助!
    【解决方案2】:

    我认为这应该是您的解决方案。没有把握。刚刚试了一下

    db.TempCollections.aggregate([  
       {  
          $lookup:{  
             from:"TempCollections",
             let:{
                leftone_id:"$one_id",
                lefttwo_id:"$two_id"
            },
            pipeline:[
                {
                    $match: {
                          $expr: {
                             $and: [
                                {
                                   $eq: [
                                      "$one_id",
                                      "$$lefttwo_id"
                                   ]
                                },
                                {
                                   $eq: [
                                      "$two_id",
                                      "$$leftone_id"
                                   ]
                                }
                             ]
                          }
                       }
                }
            ],
             as:"Final"
          }
       }
    ],
    {
    allowDiskUse:true
    });
    

    【讨论】:

    • 感谢您的回复,但我忘了说我要指定 one_id 来匹配
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2013-03-19
    • 2019-12-28
    • 2014-09-15
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多