如何在mgo中对数组元素进行多级拉取?

How to do multi-level pull of array element in 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 中的结构数组,ProcessItem 是 Company 结构中的结构数组。我有公司 ID(结构公司的字段)和模板名称(结构文档模板的字段)。

我尝试了下面的 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 在公司内是唯一的。

您需要使用 $ 位置运算符 (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})

您可以从 mongo 记录中的数组中提取数组中的值

 change2 := bson.M{
                "$pull": bson.M{"sapinfo.systemstatus": bson.M{"$in": tags}},
            }