如何在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}},
}
我想进行多级数组元素删除。我的结构如下:-
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}},
}