使用 mongoDB 聚合不同 "columns" 中特定字段的列表

Aggregating list of a specific field in different "columns" using mongoDB

在 Golang 上使用 mongo-驱动程序。

为了保存 2 个实体之间的关系列表,我使用了一个集合,其中每个文档都有一个“uid1”和一个“uid2”,它们是每个实体的唯一标识符。任何实体都可以在两侧。 objective就是把所有和我select有关系的实体都找出来放到一个列表中。目前正在做:

cursor, err := RelationsColl.Find(ctx, bson.M{"$or": []bson.M{bson.M{"uid1": UID}, bson.M{"uid2": UID}}})

    var res []bson.M
    if err = cursor.All(ctx, &res); err != nil {
        return nil, err
    }

我在变量 res 中获取了存在 UID 变量的条目列表。相反,我想要得到的只是一个列表,其中包含相应条目中的 UID。因此,不是以以下形式获取内容:(假设我们请求与“xxxx”有关系的实体)

[[uid1:xxxx uid2:yyyy],[uid1:zzzz uid2:xxxx]]

我可以得到以下形式的东西:

[yyyy, zzzz]

这可能与聚合有关吗?

希望我说清楚了,如果有任何未明确说明的内容,请在下方评论。

下面的代码应该可以为您解决问题

UID := "id-1"  // Change this variable to your `match` value

matchStage := bson.D{
    {"$match", bson.D{
        {"$or", bson.A{
            bson.D{{"uid1", UID}},
            bson.D{{"uid2", UID}},
        }},
    }},
}
groupStage := bson.D{
    {"$group", bson.D{
        {"_id", nil},
        {"uids1", bson.D{
            {"$addToSet", "$uid1"},
        }},
        {"uids2", bson.D{
            {"$addToSet", "$uid2"},
        }},
    }},
}
projectStage := bson.D{
    {"$project", bson.D{
        {"uids", bson.D{
            {"$filter", bson.D{
                {"input", bson.D{
                    {"$concatArrays", bson.A{"$uids1", "$uids2"}},
                }},
                {"as", "arrayElem"},
                {"cond", bson.D{
                    {"$ne", bson.A{"$$arrayElem", UID}},
                }},
            }},
        }},
    }},
}
cursor, err := collection.Aggregate(
    ctx,
    mongo.Pipeline{matchStage, groupStage, projectStage},
    options.Aggregate().SetAllowDiskUse(true),
    )
if err != nil {
    panic(err)
}

var cursorResult []bson.M
err = cursor.All(ctx, &cursorResult)
if err != nil {
    panic(err)
}

fmt.Println("Cursor Result: ", cursorResult[0]["uids"])