2012-01-28 37 views
34

私はCodeigniterとMongoDBを使ってWebアプリケーションを開発しています。 ユーザーはファイルをアップロードでき、他のユーザーはコメントを付けることができます。MongoDBで配列から特定の項目を削除する

コメントは、メインファイルドキュメントのコメントと呼ばれる配列に格納されます。 これで問題はありませんが、配列から特定のコメントを削除するにはどうすればよいですか?

ユーザーは複数のコメントを追加できるため、IDはキーとして使用できません。どのように私はそれを行うことができます をお勧めしますか?

これは私のコメントの配列です:あなたは、ユーザーID、名前やコメントを照合することによって、コメント項目を識別することができる場合

"comments": [ 
     { 
      "user_id": ObjectId("4f240b433dc7937d68030000"), 
      "user_name": "james", 
      "user_comment": "This is a comment", 
      "created_at": "2012-01-2821: 20: 44" 
     }, 
     { 
      "user_id": ObjectId("4f240b433dc7937d68030000"), 
      "user_name": "mandy", 
      "user_comment": "This is another comment", 
      "created_at": "2012-01-2821: 31: 07" 
     } 
    ], 

答えて

56

- あなたは適切な条件と一緒に$pull修飾子とupdate()コマンドを使用して、そのコメントを削除することができます。

上記のようにできない場合は、コメントに一意のID(例:UUID)を含めてください。

db.coll.update({<cond to identify document}, {$pull: {'comments': {'name': <name>}}}) 

あなたが好まれているID、使用している場合::

db.coll.update({<cond to identify document}, {$pull: {'comments': {'id': <id>}}}) 
+0

興味深いですね。 mongoDBにUUIDを割り当てることはできますか?はいの場合、どうですか? –

+0

この場合のように、ドキュメント内の値については、UUIDを生成する必要があります。 PHPにはuniqid()もありますが、これも使用できます。 – rsmoorthy

+0

徹底的な答えをありがとう。この1つのドキュメントは暗いです。 – jcollum

3

を多分あなたのように、その 'created_at' 時間によってコメントを削除することができ、コメントを削除するには、次の操作を行うに

時間はユニークです。

$db.coll.update({cond to identify document},{$pull:{'comments':{'created_at':<>}}}) 
+0

複数のユーザーが同じ秒で投稿することができます。そのため、各コメントに固有のIDを生成します。 –

0

私はそれを挿入するときに各コメントにmongodb idを追加したと思います。このように新しいmongodb idを作成することができます。

$comment_id = new MongoID(); 

さて、あなたは@ smoorthyの答えのように$プル+ $更新とIDでコメントを削除することができます。

関連する問題