Porting MVC Music Store to Raven: Advanced Migrations
I noticed that I had typo when I inserted the albums data, the artist data was stored as “Arist”. This give me a chance to show you how we can do a migration that is a bit more advanced.
using (var documentStore = new DocumentStore { Url = "http://localhost:8080" }) { documentStore.Initialise(); var count = 0; do { var queryResult = documentStore.DatabaseCommands.Query("Raven/DocumentsByEntityName", new IndexQuery { Query = "Tag:`Albums`", PageSize = 128, Start = count }); if (queryResult.Results.Length == 0) break; count += queryResult.Results.Length; var cmds = new List<ICommandData>(); foreach (var result in queryResult.Results) { var arist = result.Value<JObject>("Arist"); if(arist == null) continue; result["Artist"] = arist; result.Remove("Arist"); cmds.Add(new PutCommandData { Document = result, Metadata = result.Value<JObject>("@metadata"), Key = result.Value<JObject>("@metadata").Value<string>("@id"), }); } documentStore.DatabaseCommands.Batch(cmds.ToArray()); } while (true); }
The code itself should be hard to follow I think, it shows how we can manipulate documents by working with the JSON document directly, instead of having to go through an object layer.
Comments
"The code itself should be hard to follow"
Should or Shouldn't?
Code makes sense.
I think it isn't very hard to follow, if you want it to, you should try a bit harder. This is the second time you're using a "while true...do" pattern. Is this because of the asynchronous nature of setting up the index? If that's the case, it could be helpful to have some high-level construct for situations like that that blocks until the desired effect is in place.