docs: function fetch_objects_by_expression(data, prop, fields, expression) {
  				if(!is_object(data)) { return error('fetch_objects_by_expression(data, ..., ...) not object: '+ data); }
  				if(!is_string(prop)) { return error('fetch_objects_by_expression(..., prop, ...) not string: '+ prop); }
  				if(!is_string(expression)) { return warn('Expression was not string: {' + expression + '}, typeof ' + (typeof expression)); }
  
  				prop = prop.trim();
  				expression = expression.trim();
  
  				var type_name, type_prop;
  				var type_start = expression.indexOf('#');
  				if(type_start >= 0) {
  					type_name = expression.substr(0, type_start).trim();
  					type_prop = expression.substr(type_start+1).trim();
  				} else {
  					type_name = expression;
  				}
  
  				if(!type_prop) {
  					return error('No property name in expression: {'+ expression+'}');
  				}
  
  				var rows = expression_query(data, prop, type_name, type_prop, fields);
  				if(!is_array(rows)) {
  					return rows;
  				}
  
  				var warnings = [];
  
  				if(!data.documents) {
  					data.documents = {};
  				}
  
  				if(!data.documents.expressions) {
  					data.documents.expressions = {};
  				}
  
  				if(!is_array(data.documents.expressions[prop])) {
  					if(data.documents.expressions.hasOwnProperty(prop)) {
  						data.documents.expressions[prop] = [data.documents.expressions[prop]];
  					} else {
  						data.documents.expressions[prop] = [];
  					}
  				}
  
  				var id_list = data.documents.expressions[prop];
  
  				rows.forEach(function(row) {
  					var uuid = row.id;
  					if(is_uuid(uuid)) {
  						id_list.push(uuid);
  						if(data.documents[uuid] === undefined) {
  							data.documents[uuid] = row;
  						//} else {
  						//	warnings.push( warn('Document already fetched: ' + uuid) );
  						}
  					} else {
  						warnings.push( warn('Document did not have UUID property: ' + JSON.stringify(row, null, 2) ) );
  					}
  				});
  
  				if(warnings.length >= 1) {
  					return warnings.shift();
  				}
  			}