gpt4 book ai didi

mongodb - InvalidPipelineOperator用于使用golang在mongodb中进行聚合和过滤

转载 作者:行者123 更新时间:2023-12-01 22:16:19 26 4
gpt4 key购买 nike

我有一个具有以下结构的mongodb集合:

{
"_id" : ObjectId("5e2af47006d5b7820876cc34"),
"uuid" : "6ec5245e-d512-4496-995d-9a7d1073ff80",
"beaconid" : "fc775907-f442-43ca-9b86-78fede5f9218",
"locations" : [
{
"longitude" : 464.4,
"latitude" : 34.8,
"establish" : ISODate("2020-01-24T13:43:12.895Z")
},
{
"longitude" : 464.4,
"latitude" : 34.8,
"establish" : ISODate("2020-01-24T13:47:09.066Z")
},
{
"longitude" : 464.4,
"latitude" : 34.8,
"establish" : ISODate("2020-01-24T15:03:02.770Z")
},
{
"longitude" : 464.4,
"latitude" : 34.8,
"establish" : ISODate("2020-01-24T15:23:36.891Z")
}
}
{
......
}

我目前正在开发一个API,以便在golang中使用mongodb的聚合和过滤功能来获取特定时间范围内的所有位置。

例如:我想从ISODate(“2020-01-24T13:45:00.066Z”)到ISODate(“2020-01-24T15:10:00.770Z”)检索所有值,该值仅检索中间两个位置,输出应为:
{
"_id" : ObjectId("5e2af47006d5b7820876cc34"),
"uuid" : "6ec5245e-d512-4496-995d-9a7d1073ff80",
"beaconid" : "fc775907-f442-43ca-9b86-78fede5f9218",
"locations" : [
{
"longitude" : 464.4,
"latitude" : 34.8,
"establish" : ISODate("2020-01-24T13:47:09.066Z")
},
{
"longitude" : 464.4,
"latitude" : 34.8,
"establish" : ISODate("2020-01-24T15:03:02.770Z")
}
}

为实现此目的,我引用了以下两个网页来进行聚合和筛选的管道:

https://github.com/simagix/mongo-go-examples/blob/5a04bab8b677e7b160dbe4c327f7ac68efb83ba5/examples/aggregate_reduce_test.go

How to write bson form of mongo query in golang?

起初,我在使用github的mdb.MongoPipeline(pipeline)时遇到麻烦,所以我决定使用github的管道格式,并以mongo.Pipeline {...}堆栈溢出的第二个答案的形式使用它

生成的管道变为:
new_pipeline = mongo.Pipeline{
{{"$match", bson.D{
{"beaconID", r.URL.Query()["beaconid"][0]},
}}},
{{"$project", bson.D{
{"locations", bson.D{
{"$filter", bson.D{
{"input", "$locations"},
{"as", "locations"},
{"cond", bson.D{
{"$and", bson.D{
{"$lte", bson.D{{"locations.establish", r.URL.Query()["rangeend"][0]}}},
{"$gtd", bson.D{{"locations.establish", r.URL.Query()["rangebegin"][0]}}},
}},
}},
}},
}},
}}},
{{"$unwind", "$locations"}},
}

opts := options.Aggregate()
cursor, err := collection.Aggregate(context.TODO(), new_pipeline, opts)

但是,通过运行程序,出现了一个我不知道如何解决的错误:

(Location15983)表示表达式的对象必须恰好具有一个字段:{$ lte:{$$ locations。Establishment:new Date(1580122004573)},$ gtd:{$$ locations。Establishment:new Date(1578826004573)}}

然后,当尝试通过测试不同的管道情况进行调试时,该管道会导致另一个问题:
...
{"as", "locations"},
{"cond", bson.D{
{"$lte", bson.D{{"$$locations.establish", r.URL.Query()["rangeend"][0]}}},
}},
}},
...

错误是:
(InvalidPipelineOperator)无法识别的表达式'$$ locations。Establishment'

任何想法为什么会发生这两个错误?以及如何解决?
谢谢。

最佳答案

任何想法为什么会发生这两个错误?

由于缺少数组运算符,您遇到了这些错误。运算符$and需要一个数组,该数组应表示为bson.A

以及如何解决?

请查看以下管道:

// Create a date object using time.Parse()
lteDate, err := time.Parse(time.RFC3339, "2020-01-24T15:10:00.770Z")
if err!=nil {log.Fatal(err)}
gteDate, err := time.Parse(time.RFC3339, "2020-01-24T13:45:00.066Z")
if err!=nil {log.Fatal(err)}

// MongoDB Aggregation Pipeline Stages
matchStage := bson.D{
{"$match", bson.D{
{"beaconid", "fc775907-f442-43ca-9b86-78fede5f9218"},
}},
}

projectStage := bson.D{
{"$project", bson.D{
{"locations", bson.D{
{"$filter", bson.D{
{"input", "$locations"},
{"as", "locations"},
{"cond", bson.D{
{"$and", bson.A{
bson.D{{"$lte", bson.A{"$$locations.establish", lteDate}}},
bson.D{{"$gte", bson.A{"$$locations.establish", gteDate}}},
}},
}},
}},
}},
}},
}

unwindStage := bson.D{
{"$unwind", "$locations"},
}
pipeline := mongo.Pipeline{matchStage, projectStage, unwindStage}

上面的代码段是使用最新版本的 mongo-go-driver(v1.2.x)编写的

关于mongodb - InvalidPipelineOperator用于使用golang在mongodb中进行聚合和过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59929841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com