使用 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"])
在 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"])