2016-11-14 8 views
0

私はいくつかの非常に長い投稿を持つブログを持っているとしましょう。MongoDB(mongoose)サブストリングを取得します

私は投稿のリストを「プレビューモード」で表示したいと思います。たとえば、最初の50文字のテキストのみを表示します。

シンプルな答えがこれを行うには、次のとおりです。

Post.find(
    (err, posts) => { 
     if(err) return console.log(err); 
     posts.forEach(
      post => { 
       console.log('post preview:', post.data.substr(0,50) + '...'); 
      } 
     ) 
    } 
) 

我々は特定のコレクションからすべてのデータを取得するこの方法です。 各投稿に3KBを超えるデータがある場合、30件の投稿を取得すると、データ転送と処理に関して非常に非効率的なようです。

これで、すでにスライスされた文字列をDBから取得する方法があるのだろうかと思いましたか?

少なくとも、私の問題の解決策はありますか?

+1

['$ substr'](https://docs.mongodb.com/v3.2/reference/operator/aggregation/substr/)があります。 – robertklep

答えて

1

はい、あなたはこのようなクエリで$ substrは演算子を使用することができます。

db.collection.aggregate(
    [ 
    { 
     $project: 
      { 
      preview: { $substr: [ "$data", 0, 50 ] } 
      } 
     } 
    ] 
) 

編集:

それだけでよくを持っているための$ substrははMongoDBの3.4から廃止されました

ASCII文字の文字列に対して定義された動作。あなたはUTF-8の問題に直面している場合は、$ substrCPオペレータ を使用するために3.4をMongoDBのためにアップグレードを検討ので、あなたのクエリは次のようになります。今日のよう

db.collection.aggregate(
    [ 
    { 
     $project: 
      { 
      preview: { $substrCP: [ "$data", 0, 50 ] } 
      } 
     } 
    ] 
) 

、MongoDBの3.4は、開発のためにのみ利用可能です、プロダクションバージョンはすぐにリリースされるべきです

+0

OK、このエラーはどうですか: 'MongoError:$ substr:無効な範囲です、終了インデックスはUTF-8文字の真中にありますか? ' –

+0

@Lepta私の編集を参照してください – felix

関連する問題