如何在mgo中进行数组元素的多级拉动?

时间:2016-05-20 11:11:16

标签: go mgo

我想做一个多级数组元素删除。我的结构如下: -

type Company struct {
    Id              bson.ObjectId `bson:"_id,omitempty"`
    CompanyName     string
    Process         []ProcessItem
}

type ProcessItem  struct{
    SortOrder       int
    Documents       []DocumentTemplate
}

type DocumentTemplate struct {
    Id              bson.ObjectId `bson:"_id,omitempty"`
    TemplateName    string
}

我想删除DocumentTemplate类型的对象。 DocumentTemplate是ProcessItem中的结构数组,它是Company结构中的结构数组。我有公司ID(struct Company的字段)和TemplateName(struct DocumentTemplate的字段)。

我尝试了以下mgo pull查询,但它无效。

c := db.C("company")
pullQuery := bson.M{"process": bson.M{"documents.templatename": "xyz"}}
err := c.Update(bson.M{"_id": "123"}, bson.M{"$pull": pullQuery})

请指出我在这里犯的错误。感谢。

修改 添加一个示例文档以明确问题

{
    "_id" : ObjectId("573da7dddd73171e42a84045"),
    "companyname" : "AAA",
    "process" : [ 
        {
            "processname" : "Enquiry",
            "sortorder" : 0,
            "documents" : [ 
                {
                    "templatename" : "xyz",
                    "processname" : "Enquiry"
                }, 
                {
                    "templatename" : "ss",
                    "processname" : "Enquiry"
                }
            ]
        }, 
        {
            "processname" : "Converted",
            "processtype" : 1,
            "sortorder" : 2,
            "documents" : [ 
                {
                    "templatename" : "dd",
                    "processname" : "Converted"
                }, 
                {
                    "templatename" : "fg",
                    "processname" : "Converted"
                }
            ]
        }
    ]
}

我只需要提取一条DocumentTemplete记录,如下所示:

{
   "templatename" : "xyz",
   "processname" : "Enquiry"
}

N.B:TemplateName在公司内部是唯一的。

2 个答案:

答案 0 :(得分:3)

您需要使用$位置运算符(https://docs.mongodb.com/manual/reference/operator/projection/positional/)。为了能够使用它,您还必须在查询中添加以下内容:

"process.documents.templatename": "xyz"

您的Update声明应如下所示:

c := db.C("company")
pullQuery := bson.M{"process.$.documents": bson.M{"templatename": "xyz"}}
err := c.Update(bson.M{"_id": "123", "process.documents.templatename": "xyz"}, bson.M{"$pull": pullQuery})

答案 1 :(得分:0)

您可以从mongo记录

中的数组中提取数组中的值
 change2 := bson.M{
                "$pull": bson.M{"sapinfo.systemstatus": bson.M{"$in": tags}},
            }