code: func (self *Query) initWithObjectId(document reflect.Value) {
  
  	//If there is nothing to populate, init the fields with object id types
  	if len(self.populate) == 0 {
  
  		structElement := document.Elem()
  		fieldType := structElement.Type()
  
  		//Iterate over all struct fields
  		for fieldIndex := 0; fieldIndex < structElement.NumField(); fieldIndex++ {
  
  			relationTag := fieldType.Field(fieldIndex).Tag.Get("relation")
  			field := structElement.Field(fieldIndex)
  
  			if len(relationTag) > 0 {
  
  				if relationTag == REL_1N {
  
  					if field.IsNil() {
  
  						//field.Set(reflect.ValueOf(make([]bson.ObjectId, 0, 0)))
  
  					} else {
  
  						slice := field.Elem()
  						idSlice := make([]bson.ObjectId, slice.Len(), slice.Len())
  
  						for index := 0; index < slice.Len(); index++ {
  							idSlice[index] = slice.Index(index).Elem().Interface().(bson.ObjectId)
  						}
  
  						field.Set(reflect.ValueOf(idSlice))
  
  					}
  
  				} else {
  
  					if !field.IsNil() {
  
  						objectId := field.Elem().Interface().(bson.ObjectId)
  						field.Set(reflect.ValueOf(objectId))
  					}
  
  					//field.Set(reflect.Zero(reflect.TypeOf(bson.ObjectId(""))))
  				}
  			}
  		}
  	}
  }
docs: /*
   * bson object ids have to be copied again, because after passing
   * the result reference to the mgo execute function the type
   * is overwritten as interface{} again. So initWithObjectId initializes
   * bson.ObjectId and []bson.ObjectId types.
   */