MongoDB C#驱动程序FindAndModify

时间:2011-10-03 12:55:03

标签: c# mongodb

我正在尝试在MongoDB中运行FindAndModify操作,但是我遇到了异常的异常

var query = Query.EQ("_id", wiki.ID);
var sortBy = SortBy.Descending("Version");
var update = Update.Set("Content", wiki.Content)
                    .Set("CreatedBy", wiki.CreatedBy)
                    .Set("CreatedDate", wiki.CreatedDate)
                    .Set("Name", wiki.Name)
                    .Set("PreviousVersion", wiki.PreviousVersion.ToBsonDocument())
                    .Set("Title", wiki.Title)
                    .Set("Version", wiki.Version);
var result = collection.FindAndModify(query, sortBy, update, true);

我得到的例外是

WriteStartArray can only be called when State is Value, not when State is Initial
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: WriteStartArray can only be called when State is Value, not when State is Initial

Source Error:

Line 45:                 var query = Query.EQ("_id", wiki.ID);
Line 46:                 var sortBy = SortBy.Descending("Version");
Line 47:                 var update = Update.Set("Content", wiki.Content)
Line 48:                                    .Set("CreatedBy", wiki.CreatedBy)
Line 49:                                    .Set("CreatedDate", wiki.CreatedDate)

思考?我已经在mongodb的网站上按照API实现了这个。

EDIT-- 根据@jeffsaracco修复

var update = Update.Set("Content", wiki.Content)
.Set("CreatedBy", wiki.CreatedBy)
.Set("CreatedDate", wiki.CreatedDate)
.Set("Name", wiki.Name)
.PushAllWrapped<WikiHistory>("PreviousVersion", wiki.PreviousVersion)
.Set("Title", wiki.Title)
.Set("Version", wiki.Version);

4 个答案:

答案 0 :(得分:2)

您使用PushAllWrapped的解决方案可能是您想要的也可能不是您想要的。它与Set不同,因为它将新值附加到当前数组值。如果要使用新数组值替换现有数组值,可以使用此版本的Set:

var update = Update.Set("Content", wiki.Content)
    // other lines
    .Set("WikiHistory", new BsonArray(BsonDocumentWrapper.CreateMultiple(wiki.PreviousVersion);

其中说:将WikiHistory元素的值设置为通过序列化自定义类型的PreviousVersion的包装值构造的新BsonArray。

答案 1 :(得分:1)

您的某个列是否为数组类型?如果是这样,您可能需要致电

Update.Push

OR

Update.PushAll
该列的

,如果PreviousVersion已经是BsonDocument,您可能不需要再次转换

答案 2 :(得分:0)

你确定你的SortBy.Descending吗?

api并未声明您可以使用somehting else而不是string []作为参数(http://api.mongodb.org/csharp/current/html/96408b4e-c537-0772-5556-6f43805dd4d4.htm)< / p>

答案 3 :(得分:0)

最后,因为我只是跟踪对象的历史记录,所以我最终使用了.AddToSetWrapped<WikiHistory>("PreviousVersion", CurrentVersion),只是将项目附加到对象的集合中。