如何在MongoDb中使用$ arrayElemAt

时间:2019-12-09 00:08:48

标签: mongodb go mongodb-query

我有以下管道,我想在Golang中使用它并将其转换为bson.M。一种方法是使用bson.UnmarshalExtJSON,但我想知道该管道的bson.M的确切含义。实际上,我的问题出在$ arrayElemAt行。

            "$lookup": {
                        "from" : "cities",
                        "localField": "cityId",
                        "foreignField": "_id",
                        "as" : "city"
                    }}
            , {
            "$project": {
              "_id": 0,
              "name": 1,
              "age": 1,
              "city": { "$arrayElemAt" : ["$city.name", 0]}
            }}

我用这个bson.M:

   stage1 := bson.M{
        "$lookup": bson.M{
            "from": "cities",
            "localField": "cityId",
            "foreignField": "_id",
            "as" : "city",
        },
    }

    stage2 := bson.M{
        "$project": bson.M{
            "_id": 0,
            "name": 1,
            "age": 1,
            "city": bson.M{ "$arrayElemAt" : bson.M{"$city.name", 0} },
        },
    }

    pipeline := make([]bson.M, 0)

    pipeline = append(pipeline, stage1)
    pipeline = append(pipeline, stage2)

上面的代码给了我编译器错误:缺少地图文字中的键在我有“ city”的那一行:bson.M {“ $ arrayElemAt”:bson.M {“ $ city.name“,0}} 。那么将$ arrayElemAt定义为bson.M的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

正确的翻译方式

"city": { "$arrayElemAt" : ["$city.name", 0]}

将是:

bson.M{"$arrayElemAt":[]interface{}{"$city.name",0}

由于以下原因,您遇到了编译错误:

bson.M{"$city.name", 0} 

bson.M是一个映射,因此正确的语法应使用:而不是,