Taxonomy Fields and OData Queries

This post will go over taxonomy fields and OData queries in SharePoint. These are generally difficult to do, based on the field’s value containing the ID of the term instead of the value.

MMS Hidden Fields

When a taxonomy field is added to a list, a couple hidden fields are added as well.

Hidden Value Field

A hidden note field will be added with an internal field name of [Internal Field Name]_0. This hidden field contains the term value. This field can be easily queried as part of the OData request.

OData Query

This code example will use the gd-sprest core library to execute requests to the REST api. After we get the results, we will update the field value’s “Label” property from the term id to its label.

import { List } from "gd-sprest";

// Get the list
(new List("[My List Name]"))
  // Get the Items
    .Items()
    // Include the hidden value field
    .query({
      Select: ["*", "MMSInternalFieldName", "MMSInternalFieldName_0"]
    })
    // Execute the request
    .execute(items => {
      // Parse the items
        for(let i=0; i<items.results.length; i++) {
          let item = items.results[i];

            // See if an MMS value exists
            let mmsValue = item["MMSInternalFieldName"];
            let termValue = item["MMSInternalFieldName_0"];
            if(mmsValue && termValue) {
              // Replace the label with the value
                item["MMSInternalFieldName"].Label = termValue.split("|")[0];
            }
        }
    });

Hidden TaxCatchAll Field

The hidden TaxCatchAll field is contains the term’s id and value for all MMS fields in the list.

Querying Taxonomy Fields

The only way to query a Taxonomy field is by using a CAML query. If you try to filter on the field or hidden value field in an OData request, you will see an error denying the request due to the field type. The TaxCatchAll field can be used for filtering by a term’s id or label.

OData Query

This code example will use the gd-sprest core library to execute requests to the REST api. This code example will display how to filter by the term’s id or label. After we get the filtered results, we will update the field value’s “Label” property from the term id to its label.

import { List } from "gd-sprest";

// Get the list
(new List("[My List Name]"))
  // Get the Items
    .Items()
    // Include the hidden value field
    .query({
        Filter: "TaxCatchAll/IdForTerm eq '[Term ID]' or TaxCatchAll/Term eq '[Term Label]'",
        Expand: ["TaxCatchAll"],
      Select: ["*", "TaxCatchAll/Id", "TaxCatchAll/Term", "MMSInternalFieldName"]
    })
    // Execute the request
    .execute(items => {
      // Parse the items
        for(let i=0; i<items.results.length; i++) {
          let item = items.results[i];
            let mmsValues = item["TaxCatchAll"];

            // See if an MMS value exists
            let mmsValue = item["MMSInternalFieldName"];
            if(mmsValue) {
              // Parse the mms values
                for(let j=0; j<mmsValues.results.length; j++) {
                  let wssId = mmsValues.results[j].Id;

                    // See if this is the target field value
                    if(wssId == item["MMSInternalFieldName"].WssId) {
                      // Set the value
                        item["MMSInternalFieldName"].Label = mmsValues[j].Term;

                        // Break from the loop
                        break;
                    }
                }
            }
        }
    });