3

こんにちは、次のデータベースがあります。

忙しい猫

私の質問は、「スレッド=スローンの投稿から名前を選択する」方法です。

私は RockMongo シェルを試しているため: " db.users.find({"posts.thread":'Sloan'}) " しかし、それはすべてのコレクションデータを返します

***** json-generator.com の使用 ********************

[
            '{{repeat(5, 7)}}',
            {
                id: '{{index}}',
                group: '{{surname}}',
                name: '{{firstName}} {{surname}}',

                posts: [
                    '{{repeat(25)}}',
                    {
                        thread:'{{surname}}',
                        sb:[
                            '{{repeat(100)}}',
                            {
                                id: '{{index}}',
                                name: '{{firstName}} {{surname}}'

                            }
                        ]
                    }
                ],

                users:[
                    '{{repeat(25)}}',
                    {
                        name:'{{firstName}}'
                    }]


            }
        ]
4

6 に答える 6

2

少し明確にするために...次のようなデータベースがある場合:

ここに画像の説明を入力

次に、これを行うdb.users.find({ posts: { $elemMatch: { thread: "Sloan" } } })と、次のようになります (すべての要素の投稿が含まれます)。

ここに画像の説明を入力

するとdb.users.find({"posts.thread":'Sloan'},{'posts.$':1})、これが得られます (関連する投稿のみが含まれています)。

ここに画像の説明を入力

(ちなみに、実行は高速です...そして、posts.thread にインデックスを追加すると、さらに高速になります。)

最後にもう 1 つ、ここで誤解を招く可能性があると思います。db.users.find({ posts: { $elemMatch: { thread: "Sloan" } } }, { name: 1 })投影は要素名「グロリア シャープ」を与えますが、質問から私が理解していることから、彼はpost.thread.sb.name. そのため、彼は、その要素のすべての投稿ではなく、関連する投稿のみを回答として取得したいと考えています。

于 2013-08-21T11:26:10.833 に答える
0
db.users.aggregate(
    { $unwind:'$posts' }, 
    {$match: {'posts.thread': 'Sloan'} },
    {$group:{_id:'$name', posts:{$push:'$posts'} }});

トピックコメントのこのリンクから学び、@Stennieの回答に従い、正しいと思う回答を提供しました。

$unwind配列を独立したドキュメントに切り取り$group、再度配列にします。

于 2013-08-17T10:35:21.860 に答える
0

次のように $elemMatch 演算子を使用して、必要なものを取得できます。

db.users.find({ posts: { $elemMatch: { thread: "Sloan" } } }, { name: 1 })
于 2013-08-17T16:15:18.847 に答える