Golang , mongodb 做不到 select

Golang , mongodb can not do select

在我的例子中,我有一个集合,其中存储了结构如下的数据

{ 
    "_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 in ch

您可以使用聚合框架实现此目的,这要归功于 MongoDB 3.4[=24= 中引入的 $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)

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

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