2011-01-03 13 views
10
Blog { 
    id:"001" 
    title:"This is a test blog", 
    content:"...." 
    comments:[{title:"comment1",content:".."},{title:"comment2",content:"..."}]  
} 

コメントはブログの内側のリストです。Mongodbの内部リストにオブジェクトを更新/挿入するにはどうしたらいいですか?

しかし、私はどのようにコメント1を取り出すことができますか? ブログに新しいコメントを挿入/更新するにはどうすればよいですか?完全なブログを取得してコメントリストにコンテンツを挿入/更新すると、ブログ全体を保存して、同時にどのようにisuueを解決できますか?

ありがとうございました。

答えて

5

埋め込みドキュメントを取得するには、マスタドキュメントを取得し、埋め込みドキュメントの埋め込みドキュメントで必要なドキュメントを検索する必要があります。実際にMongoDBでうまくいく方法はありません。

埋め込みドキュメントに挿入/更新するには、$pushおよび$setクエリシステムを使用してください。

+0

ありがとう、しかし、私はコメント1だけを取得したいと思っています。コメント数が多いとパフォーマンスが出る可能性があります。 –

+0

あなたは正しいデザインで埋め込まれたドキュメントを使用しています文書は時間の経過と共に成長する。あなたは仮想コレクションを待つ必要があります – shingara

21
Blog { 
    id:"001" 
    title:"This is a test blog", 
    content:"...." 
    comments:[{title:"comment1",content:".."},{title:"comment2",content:"..."}]  
} 

、新しいコメントを挿入$pushを使用するには:

db.blogs.update({id:"001"}, {$push:{comments:{title:"commentX",content:".."}}}); 

コメントを更新するには、$setを使用します。

db.blogs.update({id:"001"}, {$set :{"comments.2": {...} }}); 
db.blogs.update({id:"001"}, {$set :{"comments.2.title": "new title" }}); 

2は、与えられたコメントの指標です。引用符の使用が必要です。

+1

より実用的な答え - 受け入れられるとマークされるべきです –

+0

2つの異なるスレッドがある場合は、この解決策に疑いがあります。競合状態(競合状態)、mongoは文書に保存されているリストの2項目を保証しますか? – landrady

1

タイトルで特定のコメントを更新する。

db.blogs.update({'comments.title': 'comment1'}, {$set :{"comments.$.title": "new title" }}); 

コメントの内容をタイトルで更新することもできます。

db.blogs.update({'comments.title': 'comment1'}, 
{$set :{"comments.$.title": "new title", 'comments.$.content': 'this is content' }}); 

問題があれば返信してください。

関連する問題