查询技术:根据'aid'和以'abc'开头的'name'字段,联接集合A与B

mongo 两个集合联合查询,查询条件两个集合都有字段参与,怎么写?

在MongoDB中,可以使用聚合管道的方式对多个集合进行联合查询。

假设有两个集合A和B,它们都有一个字段field1,在聚合管道中可以使用$lookup和$match操作符将这两个集合连接起来,并且匹配条件是field1相等:

db.A.aggregate([
   {
      $lookup:
         {
           from: "B",
           localField: "field1",
           foreignField: "field1",
           as: "matching_docs"
         }
   },
   {
     $match:
       {
         "matching_docs": {$ne: []}
         // 这里可以加入其它的查询条件
       }
   }
])

这样就可以得到一个包含两个集合中满足条件的文档的结果集。其中$lookup用于与另一个集合建立连接,$match用于过滤掉没有匹配的文档。如果需要添加更多的查询条件,可以在$match操作中添加。

两个集合A和B都有一个字段uid, A有aid,B有name,我需要查询 aid=1,name 以abc开头的字符串

可以使用聚合管道的方式来对两个集合进行联合查询,同时加入多个匹配条件,例如:

db.A.aggregate([
  {
    $match: {aid: 1}
  },
  {
    $lookup:
      {
        from: "B",
        let: {uid_a: "$uid"},
        pipeline: [
          {
            $match:
              {
                $expr:
                  {
                    $and:
                      [
                        {$eq: ["$name", /^abc/]},
                        {$eq: ["$uid", "$$uid_a"]}
                      ]
                  }
              }
          }
        ],
        as: "matching_docs"
      }
  },
  {
    $unwind: "$matching_docs"
  },
  {
    $project:
      {
        _id: 0,
        uid: 1,
        aid: 1,
        name: "$matching_docs.name"
      }
  }
])

上述聚合操作首先在集合A中过滤出aid=1的文档,然后使用$lookup操作符连接集合B,并在pipeline中指定多个匹配条件,包括name以"abc"开头和uid相等。最后使用$unwind操作解构匹配结果并使用$project操作投影出需要的字段。

需要注意的是,$lookup操作中使用的let和pipeline参数可以将外部文档的字段值传递到内部查询中,使得两个集合的字段可以进行比较。