Q:

Set operations in RavenDB

I read this article on ravendb set operations, but it didn't show me exactly how to update a set of documents via C#.  I would like to update a field on all documents that match a certain criteria.  Or to put it another way, I would like to take this C# and make it more efficient:
var session = db.GetSession();
foreach(var data in session.Query<Data>().Where(d => d.Color == "Red"))
{
    data.Color = "Green";
    session.Store(data);
}
session.SaveChanges();

A:

See http://ravendb.net/docs/2.5/faq/denormalized-updates
First parameter is the name of the index you wish to update.
Second parameter is the index query which lets you specify your where clause. The syntax for the query is the lucene syntax (http://lucene.apache.org/java/2_4_0/queryparsersyntax.html). Third parameter is the update clause. Fourth parameter is if you want stale results.
documentStore.DatabaseCommands.UpdateByIndex("DataByColor",
    new IndexQuery
    {
        Query = "Color:red"
    }, new[]
    {
            new PatchRequest
            {
                Type = PatchCommandType.Set,
                Name = "Color",
                Value = "Green"
            }
    },
    allowStale: false);

