Golang,mongodb不能做选择

时间:2017-09-04 11:21:50

标签: mongodb select go mgo

在我的情况下,我有一个集合,我已经存储了一个结构低于

的数据
{ 
    "_id" : ObjectId("59ad187a0447d3617fb802b8"), 
    "fid" : ObjectId("59ad187a6b9600120bd03a53"), 
    "pr" : [
        {
            "_id" : ObjectId("59ad187a6b9600120bd03a53"), 
            "trashed" : false
        }
    ], 
    "ch" : [
        {
            "_id" : ObjectId("59ad18a36b9600120bd03a57"), 
            "trashed" : false
        }, 
        {
            "_id" : ObjectId("59ad18a36b9600120bd03a99"), 
            "trashed" : false
        }, 
        {
            "_id" : ObjectId("59ad18a36b9600120bd03a98"), 
            "trashed" : true
        }, 
        {
            "_id" : ObjectId("59ad18a36b9600120bd03a97"), 
            "trashed" : false
        }
    ]
}

所以我想让ch中所有被删除的对象false

这是我的查询

       type ChildParentsData struct {
       Id      bson.ObjectId `json:"_id,omitempty" bson:"_id,omitempty"`
       Trashed bool          `json:"trashed" bson:"trashed"`
       }
        var tree []ChildParentsData
        err := Connection.Session.DB("cctv_storage").C("tree").Find(
               bson.M{
                  "fid": bson.ObjectIdHex(id), "ch.trashed": false
               }).Select(
               bson.M{
                  "ch.$": 1
                }).All(&tree)

但作为回复,我收到了所有数据,但我只需要objects中的ch

2 个答案:

答案 0 :(得分:2)

您可以使用聚合框架实现此目标,这要归功于 MongoDB 3.4中引入的 $replaceRoot 运算符

我们首先获取特定fid的匹配文档,然后我们展开数组并删除ch.trashed为真的文档。最后,我们通过宣传ch作为文档根目录的内容来删除ch字段

以下是实现此目的的代码:

type ChildParentsData struct {
        Id      bson.ObjectId `json:"_id,omitempty" bson:"_id,omitempty"`
        Trashed bool          `json:"trashed" bson:"trashed"`
}
var tree []ChildParentsData

pipeline := []bson.M{
    {"$match": bson.M{"fid": bson.ObjectIdHex("59ad187a6b9600120bd03a53")}},
    {"$unwind": "$ch"},
    {"$match": bson.M{"ch.trashed": false}},
    {"$replaceRoot": bson.M{"newRoot": "$ch"}}}

err = Connection.Session.DB("cctv_storage").C("tree").Pipe(pipeline).All(&tree)

if err != nil {
    fmt.Printf("error: %v", err)
    os.Exit(0)
}
fmt.Printf("doc: %v", tree)

答案 1 :(得分:0)

获取特定字段而不是所有字段的快速方法是使用投影。 Golang的示例在这里:

    filter := bson.D{{"_id" , bson.ObjectIdHex("59ad187a6b9600120bd03a53")}}
    projection := bson.D{{"ch", 0}}
    collection.FindOne(context.TODO(), filter, options.FindOne())