2011-07-01 8 views
2

キャッピングされたサブコレクションを作成することは可能ですか?あなたは、代替として提案する何をすべきかlatest_messagesは10MongoDbでキャッピングされたサブコレクション

ない場合にキャップされている

user = { 
    name: String, 
    latest_messages: [String] 
} 

、私のような何かをやろうとしていますか?

アップデート1:

手動でキャッピングされた配列を維持する唯一のソリューションであるかのように見えます。これを行う方法は次のとおりです。

joe = {name: 'Joe', latest_messages: ['', '', '', '', '', '', '', '', '', '']} 
db.users.save(joe) 

db.users.update({name: 'Joe'}, {$push: {'latest_messages': 'hello'}}) 
db.users.update({name: 'Joe'}, {$pop: {'latest_messages': -1}}) 

db.users.update({name: 'Joe'}, {$push: {'latest_messages': 'world'}}) 
db.users.update({name: 'Joe'}, {$pop: {'latest_messages': -1}}) 

これを効率的にするための提案はありますか?

アップデート2:

1つのアトミック操作として2(プッシュ&ポップ)を行う能力を追加するために要求open Jira ticket, "SERVER-1050"あります。

+0

@ asya-kamskyの回答を参照してください。 –

答えて

0

キャップされたコレクションのドキュメント全体の数のみを指定できます。 あなたのアプリでいくつかのチェックを経なければ、配列のサイズを制限する方法はありません。

+0

上記のものより効率的になる方法はありますか? –

+1

http://docs.mongodb.org/manual/reference/operator/slice/#op._S_slice – Tobias

0

ユーザーごとに別のキャップ付きコレクションを作成することはできますか?したがって、コレクションの名前は各ユーザーの名前です。あなたがコレクションをたくさん持っているなら、MongoDBが遅くなるかどうか分かりません。何人のユーザーがいますか? 100、1000、10000のようなもの...?

+0

100,000と言ってください。これはコレクションの非標準的な使用のように感じます。パフォーマンスに何か影響はありますか? –

+0

最大値があるようです:http://www.mongodb.org/display/DOCS/Using+a+Large+Number+of+Collections – TTT

0

JIRAボードには、これを行うには2年近く掛かっているリクエストがあります。 1.6以降はmongodbの次のバージョンに追加される予定ですので、私はあなたの息を止めません。バージョン2.4のよう

https://jira.mongodb.org/browse/SERVER-991

2

このいわゆる「キャッピングされたアレイ」を行うことを可能にする機能があります。これにより、$each,$slice$sortの演算子と組み合わせて$pushの文書を配列に追加して、指定されたサイズを維持しながら1つまたは複数の文書を配列に追加し、指定されたサブ文書のフィールドで並べ替えることができます。

正確な構文と例を参照してください。here

関連する問題