2

この質問で説明されているような状況があります

公式の MongoDb C# ドライバーを使用してこのコードを作成するには、助けが必要です。

ドキュメント配列から 1 つのアイテムを更新するだけでなく、_arrayId を持つアイテムが存在しない場合は新しいアイテムを作成したいと考えています。また、同じ _arrayId を持つ 2 つの配列項目があってはなりません (使用しようとしまし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);
}

助けていただければ幸いです。

4

1 に答える 1

1

これほど簡単な方法はありませんが、SQL でこのタイプの更新に必要な労力を考えればそれほど難しくはありません。

フォローアップとして、C# ドライバーは SafeModeResult を返します (セーフモードがオンになっていることを確認してください)。この結果には、更新が行われたかどうかを確認できる DocumentsAffected プロパティがあります。そうでない場合は、値を配列に挿入する必要があります。

于 2012-05-14T17:25:30.100 に答える