Difference

Difference( source, diff, ... )
Difference( source, diff, ... )
Difference( source, diff, ... )
Difference( source, diff, ... )
difference( source, diff, ... )
Difference( source, diff, ... )

Description

The Difference function compares the source, which can be an Array or Set, with the item(s) provided by diff, and returns all of the items that exist in source that do not exist in diff.

The run time of Difference is dependent on the size of the underlying set or page, and the exclusivity of the result. For large sets or pages with many non-exclusive items, executing Difference might result in a query timeout error.

To work around this, you may specify a larger query timeout via the driver that you are using.

Parameters

Argument Type Definition and Requirements

source

The source array or set to be compared. The type of source must match all of the items in diff.

diff

One or more difference array or set reference objects. The type of all items in diff must match the type of source.

Returns

When source is an array, an array of the items in source that are missing from diff.

When source is a set reference, a set reference object of the items in source that are missing from diff.

Examples

The following query takes the source Set Reference (i.e. set reference) which is created by locating the search term "fire" in the index named "spells_by_element" and removing all difference Set Reference which was created by locating the search term "water" in the Index named "spells_by_element". The Paginate function materialized the results of the Difference operation in an array of type Page.

client.Query(
  Paginate(
    Difference(
      Match(Index("spells_by_element"), "fire"),
      Match(Index("spells_by_element"), "water"))));
{ "data": [ { "@ref": "classes/spells/181388642046968320" } ] }
curl https://db.fauna.com/ \
    -u fnAChGwBcAACAO70ziE0cfROosNJHdgBmJU1PgpL: \
    -d '{
          "paginate": {
            "difference": [
              {
                "match": { "index": "spells_by_element" },
                "terms": "fire"
              },
              {
                "match": { "index": "spells_by_element" },
                "terms": "water"
              }
            ]
          }
        }'
HTTP/1.1 200 OK
{
  "resource": {
    "data": [ { "@ref": "classes/spells/181388642046968320" } ]
  }
}
result, _ := client.Query(
    f.Paginate(
        f.Difference(
            f.MatchTerm(f.Index("spells_by_element"), "fire"),
            f.MatchTerm(f.Index("spells_by_element"), "water"),
        ),
    ),
)

fmt.Println(result)
map[data:[{181388642046968320 0xc420239980 <nil>}]]
System.out.println(
    client.query(
      Paginate(
        Difference(
          Match(Index(Value("spells_by_element")), Value("fire")),
          Match(Index(Value("spells_by_element")), Value("water"))))
    ).get());
{
  data: [
    ref(id = "181388642046968320", collection = ref(id = "spells", collection = ref(id = "collections")))
  ]
}
client.query(
  q.Paginate(
    q.Difference(
      q.Match(q.Index('spells_by_element'), 'fire'),
      q.Match(q.Index('spells_by_element'), 'water'),
    )
  )
)
.then((ret) => console.log(ret))
{ data:
   [ Ref(id=181388642046968320, collection=Ref(id=spells, collection=Ref(id=collections))) ] }
client.query(
  q.paginate(
    q.difference(
      q.match(q.index("spells_by_element"), "fire"),
      q.match(q.index("spells_by_element"), "water")
    )
  ))
{ "data": [ { "@ref": "classes/spells/181388642046968320" } ] }
client.query(
  Paginate(
    Difference(
      Match(Index("spells_by_element"), "fire"),
      Match(Index("spells_by_element"), "water"))))
{ "data": [ { "@ref": "classes/spells/181388642046968320" } ] }

The following query is similar to the example above, but it returns document events instead of the index tuples.

client.Query(
  Paginate(
    Difference(
      Match(Index("spells_by_element"), "fire"),
      Match(Index("spells_by_element"), "water")),
    events: true));
{
  "data": [
    {
      "ts": 1509244539203043,
      "action": "create",
      "resource": { "@ref": "classes/spells/181388642046968320" }
    },
    {
      "ts": 1509244539223511,
      "action": "create",
      "resource": { "@ref": "classes/spells/181388642071085568" }
    }
  ]
}
curl https://db.fauna.com/ \
    -u fnAChGwBcAACAO70ziE0cfROosNJHdgBmJU1PgpL: \
    -d '{
          "paginate": {
            "difference": [
              {
                "match": { "index": "spells_by_element" },
                "terms": "fire"
              },
              {
                "match": { "index": "spells_by_element" },
                "terms": "water"
              }
            ]
          },
          "events": true
        }'
HTTP/1.1 200 OK
{
  "resource": {
    "data": [
      {
        "ts": 1509244539203043,
        "action": "create",
        "resource": { "@ref": "classes/spells/181388642046968320" }
      },
      {
        "ts": 1509244539223511,
        "action": "create",
        "resource": { "@ref": "classes/spells/181388642071085568" }
      }
    ]
  }
}
result, _ := client.Query(
    f.Paginate(
        f.Events(
            f.Difference(
                f.MatchTerm(f.Index("spells_by_element"), "fire"),
                f.MatchTerm(f.Index("spells_by_element"), "water"),
            ),
        ),
    ),
)

fmt.Println(result)
map[data:[
  map[ts:1509244539203043 action:add document:{181388642046968320 0xc420261160 <nil>}]
  map[ts:1509244539223511 action:add document:{181388642071085568 0xc420261420 <nil>}]
]]
System.out.println(
        client.query(
           Paginate(
             Events(
               Difference(
                 Match(Index(Value("spells_by_element")), Value("fire")),
                 Match(Index(Value("spells_by_element")), Value("water"))
               )
             )
           )
        ).get());
{
  data: [
    {
      ts: 1527002946726063, 
      action: "add", 
      document: ref(id = "181388642071085568", collection = ref(id = "spells", collection = ref(id = "collections")))
    },
    {
      ts: 1527002946795516, 
      action: "add", 
      document: ref(id = "181388642046968320", collection = ref(id = "spells", collection = ref(id = "collections")))
    }
  ]
}
client.query(
  q.Paginate(
    q.Events(
      q.Difference(
        q.Match(q.Index('spells_by_element'), 'fire'),
        q.Match(q.Index('spells_by_element'), 'water'),
      )
    )
  )
)
.then((ret) => console.log(ret))
{ data:
   [ { ts: 1526677776479051,
       action: 'add',
       document:
        Ref(id=181388642046968320, collection=Ref(id=spells, collection=Ref(id=collections))) },
     { ts: 1526677776479051,
       action: 'add',
       document:
        Ref(id=181388642071085568, collection=Ref(id=spells, collection=Ref(id=collections))) } ] }
client.query(
  q.paginate(
    q.difference(
      q.match(q.index("spells_by_element"), "fire"),
      q.match(q.index("spells_by_element"), "water")
    ),
    events=True
  ))
{
  "data": [
    {
      "ts": 1509244539203043,
      "action": "create",
      "resource": { "@ref": "classes/spells/181388642046968320" }
    },
    {
      "ts": 1509244539223511,
      "action": "create",
      "resource": { "@ref": "classes/spells/181388642071085568" }
    }
  ]
}
client.query(
  Paginate(
    Difference(
      Match(Index("spells_by_element"), "fire"),
      Match(Index("spells_by_element"), "water")),
    events = true))
{
  "data": [
    {
      "ts": 1509244539203043,
      "action": "create",
      "resource": { "@ref": "classes/spells/181388642046968320" }
    },
    {
      "ts": 1509244539223511,
      "action": "create",
      "resource": { "@ref": "classes/spells/181388642071085568" }
    }
  ]
}

The following query demonstrates how various arrays are compared:

Value result = await client.Query(
  Arr(
    Difference(Arr("A", "B", "C"), Arr("B", "C", "D")),
    Difference(Arr("B", "C", "D"), Arr("A", "B", "C")),
    Difference(Arr("A", "B", "C"), Arr("C", "B", "A"))
  )
);
[
  [
    "A"
  ],
  [
    "D"
  ],
  []
]
Not available in this language yet.
result, err := client.Query(
  f.Arr{
    f.Difference(f.Arr{"A", "B", "C"}, f.Arr{"B", "C", "D"}),
    f.Difference(f.Arr{"B", "C", "D"}, f.Arr{"A", "B", "C"}),
    f.Difference(f.Arr{"A", "B", "C"}, f.Arr{"C", "B", "A"})})
fmt.Println(result)
[[A] [D] []]
System.out.println(
    client.query(
        Arr(
            Difference(
                Arr(Value("A"), Value("B"), Value("C")),
                Arr(Value("B"), Value("C"), Value("D"))
            ),
            Difference(
                Arr(Value("B"), Value("C"), Value("D")),
                Arr(Value("A"), Value("B"), Value("C"))
            ),
            Difference(
                Arr(Value("A"), Value("B"), Value("C")),
                Arr(Value("C"), Value("B"), Value("A"))
            )
        )
    ).get());
[["A"], ["D"], []]
client.query([
  q.Difference(['A', 'B', 'C'], ['B', 'C', 'D']),
  q.Difference(['B', 'C', 'D'], ['A', 'B', 'C']),
  q.Difference(['A', 'B', 'C'], ['C', 'B', 'A']),
])
.then((ret) => console.log(ret))
[ [ 'A' ], [ 'D' ], [] ]
print(client.query(
  [
    q.difference(['A', 'B', 'C'], ['B', 'C', 'D']),
    q.difference(['B', 'C', 'D'], ['A', 'B', 'C']),
    q.difference(['A', 'B', 'C'], ['C', 'B', 'A']),
  ]
))
[['A'], ['D'], []]
println(Await.result(
  client.query(
    Arr(
      Difference(Arr("A", "B", "C"), Arr("B", "C", "D")),
      Difference(Arr("B", "C", "D"), Arr("A", "B", "C")),
      Difference(Arr("A", "B", "C"), Arr("C", "B", "A"))
    )
  ),
  5.seconds
))
[["A"], ["D"], []]

Is this article helpful? 

Tell Fauna how the article can be improved:
Visit Fauna's forums or email docs@fauna.com

Thank you for your feedback!