C#官方MongoDB驱动程序代码,用于在MongoDB中更新(替换)文档中的内部数组

时间:2012-05-14 16:16:20

标签: c# mongodb mongodb-.net-driver

我遇到了这个question

中描述的情况

我需要一些帮助来使用官方MongoDb C#驱动程序编写此代码。

我不仅希望从文档数组更新一个项目,而且如果没有_arrayId这样的项目,也想创建新项目。此外,不应该有两个具有相同_arrayId的数组项(我曾尝试使用AddToSet但没有运气)。

这是一个令人头痛的问题;我希望有更简单的方法来实现这一目标。

var actionUpdate = Update.Set("Votes.$", vote.ToBsonDocument());
var actionPush = Update.Push("Votes", vote.ToBsonDocument());
var actionPull = Update.Pull("UserId", vote.UserId);

var querySpecific = Query.And(
    Query.EQ("_id", new ObjectId(_contentId)), 
    Query.EQ("Votes.UserId", vote.UserId));
var queryPromise = Query.EQ("_id", new ObjectId(_contentId));

MongoCollection collection = null; 

if (_type == ContentType.Promise)
    collection = DataService.PromiseSet.Collection;

var userVotes = collection.Count(querySpecific);
if (userVotes == 1)
{
    collection.Update(querySpecific, actionUpdate);
}
else if (userVotes == 0)
{
    collection.Update(queryPromise, actionPush);
}
else
{
    collection.Update(queryPromise, actionPull);
    collection.Update(queryPromise, actionPush);
}

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

没有一种更简单的方法,尽管如果考虑这种类型的更新在SQL中需要的工作量并不困难。

对于您的后续操作,C#驱动程序返回一个SafeModeResult(确保打开safemode)。此结果将具有DocumentsAffected属性,您可以在其中查看更新是否发生。如果没有,那么您将要将值插入数组中。