You are currently browsing legacy 5.0 version of documentation. Click here to switch to the newest 5.1 version.

We can help you with migration to the latest RavenDB

Contact Us Now
see on GitHub

Indexes: Indexing Compare Exchange Values


  • Compare exchange values can be loaded within an index using the value's key.

  • The index will update when the compare exchange value is updated, as well as when documents are modified in the indexed collection(s).

  • In this page:


Syntax

When creating an index using AbstractIndexCreationTask, use the method LoadCompareExchangeValue() to load a compare exchange value by its key.

//Load one compare exchange value
T LoadCompareExchangeValue<T>(string key);

//Load multiple compare exchange values
T[] LoadCompareExchangeValue<T>(IEnumerable<string> keys);

For javascript indexes, use the method cmpxchg(<key>).

Parameter Type Description
key string The key of a particular compare exchange value.
keys IEnumerable<string> The keys of multiple compare exchange values.


Examples

These indexes map the rooms in a hotel, as well as compare exchange values representing the guests in those rooms.

private class Compare_Exchange_Index : AbstractIndexCreationTask<HotelRoom>
{
    public class Result
    {
        public string Room;
        public string Guests;
    }

    public Compare_Exchange_Index()
    {
        Map = HotelRooms => from room in HotelRooms
                            let guests = LoadCompareExchangeValue<string>(room.RoomID)
                            select new Result
                            {
                                Room = room.RoomID,
                                Guests = guests
                            };
    }
}
private class Compare_Exchange_JS_Index : AbstractJavaScriptIndexCreationTask
{
    public Compare_Exchange_JS_Index()
    {
        Maps = new HashSet<string>
        {
            @"map('HotelRooms', function (room) { 
                var guests = cmpxchg(room.RoomID); 
                return { 
                    RoomID: room.RoomID, 
                    Guests: guests 
                };
            })",
        };
    }
}

Querying the Index

// Return all vacant hotel rooms
List<HotelRoom> vacantRooms = session
    .Query<HotelRoom, Compare_Exchange_Index>()
    .Where(x => RavenQuery.CmpXchg<string>(x.RoomID) == null)
    .OfType<HotelRoom>()
    .ToList();
// Return all vacant hotel rooms
List<HotelRoom> vacantRooms = await asyncSession
    .Query<HotelRoom, Compare_Exchange_Index>()
    .Where(x => RavenQuery.CmpXchg<string>(x.RoomID) == null)
    .OfType<HotelRoom>()
    .ToListAsync();
// Return the room occupied by VIP guests
List<HotelRoom> VIPRooms = session
    .Advanced.RawQuery<HotelRoom>(
        @"from Hotelrooms as room
        where room.Guests == cmpxchg('VIP')"
    )
    .ToList();