2016-05-20 6 views
2

Я хочу удалить элемент массива многоуровневого элемента. Мои Структуры:Как сделать многоуровневое вытягивание элемента массива в 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, который является структурным массивом в структуре компании. У меня есть идентификатор компании (поле 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}) 

Пожалуйста, укажите ошибки, которые я здесь сделал. Благодарю.

Edit: Добавление одного примера документ для ясности вопроса

{ 
    "_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" 
} 

NB: TemplateName будет уникальным внутри компании.

+0

Является 'TemplateName' уникальным, или единственный объект 'Company' может содержать много« DocumentTemplate »с тем же именем, и если да, вы хотите вытащить каждый из них? –

+0

@JohnSmith TemplateNames будет уникальным. Я добавил для этого подтверждение. Для Компании будет только одно имя шаблона «xyz». Пожалуйста, проверьте мои изменения в вопросе. Спасибо –

ответ

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}) 
+0

Спасибо, брату ... Это сработало .. –