2016-10-26 2 views
1

Ich habe ein Dokument wie folgt -Ausgabe in Mongo Abfrage mit mehreren Bedingungen von golang mit

{ 
    "_id" : "580eef0e4dcc220df897a9cb", 
    "brandId" : 15, 
    "category" : "air_conditioner", 
    "properties" : [ 
     { 
      "propertyName" : "A123", 
      "propertyValue" : "A123 678" 
     }, 
     { 
      "propertyName" : "B123", 
      "propertyValue" : "B123 678" 
     }, 
     { 
      "propertyName" : "C123", 
      "propertyValue" : "C123 678" 
     } 
    ] 
} 

Bei diesem wird die properties Array mehrere Anzahl von Elementen aufweisen. Wenn ich eine Suche über meine API durchführen, ich im Idealfall eine Anordnung ähnlich wie properties im Körper meines POST Anfrage passieren würde -

{ 
    "brandId" : 15, 
    "category" : "air_conditioner", 
    "properties" : [ 
     { 
      "propertyName" : "A123", 
      "propertyValue" : "A123 678" 
     }, 
     { 
      "propertyName" : "B123", 
      "propertyValue" : "B123 678" 
     }, 
     { 
      "propertyName" : "C123", 
      "propertyValue" : "C123 678" 
     } 
    ] 
} 

Ich habe eine Struktur, diese Informationen zu empfangen und zu dekodieren -

type Properties struct { 
    PropertyName string `json:"propertyName" bson:"propertyName"` 
    PropertyValue string `json:"propertyValue" bson:"propertyValue"` 
} 

type ReqInfo struct { 
    BrandID  int    `json:"brandId" bson:"brandId"` 
    Category  string   `json:"category" bson:"category"` 
    Properties []Properties `json:"properties" bson:"properties"` 
} 

Ich kann auch eine Mongodb $and Operation über die verschiedenen properties ausführen und nur wenn alle von ihnen übereinstimmen, wird das Dokument zurückgegeben. Das Problem hier ist, dass die Anzahl der Elemente in der properties Array nicht festgelegt ist. Ich muss in der Lage sein, nur

{ 
    "brandId" : 15, 
    "category" : "air_conditioner", 
    "properties" : [ 
     { 
      "propertyName" : "A123", 
      "propertyValue" : "A123 678" 
     } 
    ] 
} 

und Abrufen alle die passenden Dokumente (nicht nur eins) zu senden.

Ich versuchte meine Hand bei der Erstellung einer Variablengröße bson.M mit einer for-Schleife abhängig von der Größe des properties Array als Eingang empfangen wurde, konnte aber nicht den richtigen Weg, um es zu tun!

Wie soll das angegangen werden?

Antwort

1

Ich konnte dies den $and Teil durch den Aufbau separat erreichen -

var AndQuery []map[string]interface{} 
for i := 0; i < len(body.Properties); i++ { 
    log.Println(body.Properties[i]) 
    currentCondition := bson.M{"properties": bson.M{"$elemMatch": bson.M{"propertyName": body.Properties[i].PropertyName, "propertyValue": body.Properties[i].PropertyValue}}} 
    AndQuery = append(AndQuery, currentCondition) 
} 

und dann wie meine Abfrage sah -

c.Find(bson.M{"brandId": body.BrandID, "category": body.Category, "$and": AndQuery}) 
Verwandte Themen