如何在C#中的MongoDb中获得两个集合在单个文档中的输出?

ni65a41a  于 2022-11-28  发布在  Go
关注(0)|答案(2)|浏览(106)

假设我有两个名为CollectionA和CollectionB的集合,这两个集合具有不同的字段。CollectionA将具有多个具有相同字段的文档,CollectionB仅包含一个文档
范例

CollectionA
    {
       "UniqeId" :1,
       "Hobbies" : "Eating"
    },
    {
       "UniqeId" :2,
       "Hobbies" : "Sleeping"
    },
    {
       "UniqeId" :3,
       "Hobbies" : "Walking"
    }

CollectionB
    {
       "UserName" :"Sukuna",
       "UserType" : "Villan"
    }

我想要这样的输出

{
   "UniqeId" :1,
   "Hobbies" : "Eating",
   "UserName" :"Sukuna",
   "UserType" : "Villan"
}

假设CollectionA中的所有文档都包含相同的字段,您可以看到两个集合之间没有唯一字段,并且您可以看到我们需要在CollectionA中应用筛选器,即)UniqeId=1
我使用的是C#,我可以执行两个DB请求来获取这些集合详细信息(* 一个请求用于CollectionA输出,另一个请求用于CollectionB输出 *),并设法在API级别组合这两个请求以获取所需的输出,但我希望在DB级别执行。
我不希望两个DB调用,这会影响API性能,因此是否可以通过单个DB调用或使用任何聚合管道来实现这一点?

eanckbw9

eanckbw91#

使用localField 1和foreignField 1进行查找

db.a.aggregate([
  {
    $lookup: {
      from: "b",
      localField: "1",
      foreignField: "1",
      as: "docs"
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          "$$ROOT",
          { $first: "$docs" }
        ]
      }
    }
  },
  {
    $unset: [ "docs", "_id" ]
  },
  {
    $group: {
      _id: "$UserName",
      doc: { $first: "$$ROOT" }
    }
  },
  {
    $replaceWith: "$doc"
  }
])

mongoplayground

fbcarpbf

fbcarpbf2#

最后,在经历了大量的尝试和错误,并尝试使用管道之后,我可以在聚合管道中做到这一点,我使用了unionWithgroup

var pipeline1= new BsonDocument("$unionWith", 
    new BsonDocument
        {
            { "coll", "CollectionB" }, 
            { "pipeline", 
    new BsonArray
            {
                new BsonDocument("$match", 
                new BsonDocument("UniqeId", 1))
            } }
        });

var pipeline2 = new BsonDocument("$group", 
    new BsonDocument
        {
            { "_id", 0 }, 
            { "merged", 
    new BsonDocument("$push", "$$ROOT") }
        });

var pipeline3 = new BsonDocument("$replaceRoot", 
    new BsonDocument("newRoot", 
    new BsonDocument("$mergeObjects", "$merged")));

var pipeline4 = new BsonDocument("$project", 
    new BsonDocument("_id", 0));

BsonDocument[] pipeline = new BsonDocument[] { pipeline1, pipeline2, pipeline3, pipeline4 };

var dbResponse = await collection.Aggregate<BsonDocument>(pipeline).ToListAsync();

相关问题