Mongodb 在upsert中使用mgo聚合迭代器数据而不进行解组

Mongodb 在upsert中使用mgo聚合迭代器数据而不进行解组,mongodb,go,mgo,Mongodb,Go,Mgo,首先,我是新来的:) 我正在尝试使用go和mgo驱动程序在mongo中进行聚合+升级 我的代码如下所示: pipe := c.Pipe([]bson.M{{"$match": bson.M{"name":"John"}}}) iter := pipe.Iter() resp := []bson.M{} for iter.Next(&resp) { // // read "value.sha1" from each response // do a:

首先,我是新来的:)

我正在尝试使用go和mgo驱动程序在mongo中进行聚合+升级

我的代码如下所示:

pipe := c.Pipe([]bson.M{{"$match": bson.M{"name":"John"}}})
iter := pipe.Iter()
resp := []bson.M{}

for iter.Next(&resp) {
     //
     // read "value.sha1" from each response
     // do a:
     // otherCollection.Upsert(bson.M{"value.sha1": mySha1}, resp)
     //
}
pipe := c.Pipe([]bson.M{})
iter := pipe.Iter()
resp := bson.M{} // not array as you are using iterator which returns single document

for iter.Next(&resp) {
    otherCollection.Upsert(bson.M{"value.sha1": result["value"].(bson.M)["sha1"]}, resp)
}
来自聚合集合的响应可以有很多格式,因此我无法为其定义结构

我只需要从响应中获取一个字段,它是sha1,然后根据sha1条件使用收到的响应更新另一个集合


有人能给我指出正确的方向吗?

也许我误解了你的意思,但是你可以通过
地图访问返回的文档。大概是这样的:

pipe := c.Pipe([]bson.M{{"$match": bson.M{"name":"John"}}})
iter := pipe.Iter()
resp := []bson.M{}

for iter.Next(&resp) {
     //
     // read "value.sha1" from each response
     // do a:
     // otherCollection.Upsert(bson.M{"value.sha1": mySha1}, resp)
     //
}
pipe := c.Pipe([]bson.M{})
iter := pipe.Iter()
resp := bson.M{} // not array as you are using iterator which returns single document

for iter.Next(&resp) {
    otherCollection.Upsert(bson.M{"value.sha1": result["value"].(bson.M)["sha1"]}, resp)
}

在这种情况下,
interface
是一个不错的选择。你能给我更多的细节吗?可能就是这样。我仍然得到
无效操作:结果[“value”][“sha1”](类型接口{}不支持索引)
@Petru您能发布
fmt.Printf的结果(“%+v\n”,resp)
?看起来你的
resp
不是
bson.M
,这很奇怪。
map[提取的文件:文件信息:map[文件大小:235933文件类型\u描述:Win32…
我的错误在编译时我可以打印
结果[“值”]
结果[“值”][“sha1”]
抛出无效操作。@Petru try
结果[“值”](bson.M)[“sha1”]