diff --git a/pkg/expr/expr.go b/pkg/expr/expr.go
index 4c53a8a52a89fbc685e56ac01ce8357d5d5bfe37..6892206e66d2b460fbc3d7a19536651cebb43396 100644
--- a/pkg/expr/expr.go
+++ b/pkg/expr/expr.go
@@ -31,6 +31,11 @@ func Eval(ctx context.Context, input string, env map[string]interface{}) (interf
 	}
 
 	for k, v := range env {
+		if mapper, ok := v.(ExprMapper); ok {
+			e[k] = mapper.ToExprMap()
+			continue
+		}
+
 		e[k] = v
 	}
 
@@ -79,3 +84,7 @@ func IsExpression(input string) bool {
 
 	return false
 }
+
+type ExprMapper interface {
+    ToExprMap() map[string]interface{}
+}
\ No newline at end of file
diff --git a/pkg/expr/mongo.go b/pkg/expr/mongo.go
index 9a8a7cd22402addc9973421935c9f61b3dbdf288..397043c2fc9e99ad26498b3aecbf87280ac795a1 100644
--- a/pkg/expr/mongo.go
+++ b/pkg/expr/mongo.go
@@ -213,7 +213,7 @@ func (c *compiler) UnaryNode(node *ast.UnaryNode) interface{} {
 			return bson.M{c.identifier(nodeIn.Left): bson.M{"$nin": c.eval(nodeIn.Right)}}
 		}
 
-		return bson.M{"$not": c.compile(node.Node)}		
+		return bson.M{"$not": c.compile(node.Node)}
 	default:
 		panic(fmt.Sprintf("unknown operator (%v)", node.Operator))
 	}
diff --git a/pkg/references/reference.go b/pkg/references/reference.go
index ca37deb16dc48e9e487e32199851fef85acdb6ea..45c80dfdab89e57712cf670ba4cbd9bbc58d759a 100644
--- a/pkg/references/reference.go
+++ b/pkg/references/reference.go
@@ -25,6 +25,13 @@ func (r *Reference) MarshalBSON() ([]byte, error) {
 	return bson.Marshal(d)
 }
 
+func (r *Reference) ToExprMap() map[string]interface{} {
+	return map[string]interface{}{
+		"collection_id": r.CollectionID,
+		"id":            r.ID,
+	}
+}
+
 func ReferenceFromPB(refPB *pb.Reference) *Reference {
 	if refPB == nil {
 		return nil
@@ -107,4 +114,4 @@ func EqualArrays(sr1, sr2 []*Reference) bool {
 
 func (r *Reference) IsValid() bool {
 	return r != nil && r.ID != "" && r.CollectionID != "" && !r.Disabled
-}
\ No newline at end of file
+}