Search code examples
javascriptmarklogic

cts query to find unique values from a field from json document in Marklogic staging


I'm trying to write a JavaScript cts query to query only unique values from a key from a JSON document based on another key. i.e, similar to a query like: select distinct(name) from data-hub-staging where source='source1'

{
    "source": "source1",
    "name": "John",
    "DOB": "1-01-1990",
    "load_date": "2021-10-23 10:23:55"
},
{
    "source": "source1",
    "name": "John",
    "DOB": "1-01-1990",
    "load_date": "2021-10-24 10:23:55"
},
{
    "source": "source1",
    "name": "Mark",
    "DOB": "1-01-1990",
    "load_date": "2021-10-24 10:23:55"
}

I have been trying the below query, but it returns all the fields. I wanted only the unique name field.

const query = cts.jsonPropertyValueQuery(
              "source",
              "source1");

[...new Set (cts.search(query)
.toArray()
  .map(doc => doc.root.name).sort())]

Current result: [John,John,Mark]
Expected result: [John,Mark]

Solution

  • The name values are not being de-duplicated by the Set because they are text() nodes. You need to get the .valueOf() those text nodes and then the strings will be de-duplicated.

    const query = cts.jsonPropertyValueQuery(
                  "source",
                  "source1");
    
    [...new Set (cts.search(query)
    .toArray()
      .map(doc => doc.root.name.valueOf()).sort())]