2012-01-19 5 views
0

AニュースフィードPostは '好き'MongoDBの/ C#のAPIは - ネストされた文書は

"Likes" : [ 

{ 
    userid: ObjectId(ae12bcd323421223), 
    username: "user1", 
    likedate: ISODATE(xxx) 
}, 

{ 
    userid: ObjectId(ae12bcd323421224), 
    username: "user2", 
    likedate: ISODATE(xxx) 
} 


] 

A人の数を持って存在している場合はどのように決定することができる唯一のポストのように一度、したがって、ユーザーID /ユーザー名は一意である必要があります。

私はAddToSetWrappedを試しましたが、DateTimeが違っていて、とにかくオブジェクトが追加されるため、明らかに失敗します。私は現在、配列にユニークなインデックスを持っていませんが、必要に応じてそれを変更することができますか?

Likesアレイ内に特定のユーザーIDが存在するかどうかを確認し、ユーザーIDがまだ存在しない場合にのみ追加します。 (1つの原子操作として、または2つの操作として)?

答えて

1

投稿者は投稿を一度しか気に入ることができないため、ユーザーID /ユーザー名は一意である必要があります。 [...]私は現在、配列にユニークなインデックスはありませんが、必要に応じてそれを変更することができますか?

このシナリオでは、固有のキーでは対応していないことに注意してください。ユニーク制約を介してdocument in MongoDB can never violate itselfに送信されます。

ただし、Update.AddToSetWrappedは正しい方法です。あなたがそうのようなfindAndModifyを使用することができます。

_db.FindAndModify<Post>(
    Query.And(
     Query.EQ("_id", post.Id), 
     Query.NE("Likes.userId", requestingUserId)), 
    Update.AddToSetWrapped("Likes", newLike)); 

この方法は、すでに与えられたユーザーIDの「のような」、ひいては、更新を呼び出すことはありませんがあれば、それはポストを見つけることができません。

+0

私は実際にそのCollection.Update(Query.And(EQ ... NE)、Update.AddToSetWrapped、SafeMode.True)が見つかりました。 safemodeパラメータを使用する必要があるため、私の使用のために良く機能しました。これはfindandmodifyで利用できません。 – reach4thelasers

+0

申し訳ありませんが、私の悪いです。 'FindAndModify'はドキュメントも返します。これは必須ではなく、確かに高速ではありません:) – mnemosyn

関連する問題