次のMongoDBドキュメントコレクションがあるとします。
{
title : 'shirt one'
tags : [
'shirt',
'cotton',
't-shirt',
'black'
]
},
{
title : 'shirt two'
tags : [
'shirt',
'white',
'button down collar'
]
},
{
title : 'shirt three'
tags : [
'shirt',
'cotton',
'red'
]
},
...
一致したタグの総数順に、タグのリストに一致するアイテムのリストをどのように取得しますか?たとえば、次のタグのリストを入力として指定します。
['shirt', 'cotton', 'black']
一致するタグの総数で説明順にランク付けされたアイテムを取得したい:
item total matches
-------- --------------
Shirt One 3 (matched shirt + cotton + black)
Shirt Three 2 (matched shirt + cotton)
Shirt Two 1 (matched shirt)
リレーショナルスキーマでは、タグは別のテーブルになり、そのテーブルに対して結合し、一致をカウントし、カウント順に並べ替えることができます。
しかし、モンゴでは...?
このアプローチはうまくいくようですが、
- 入力タグを複数の「IN」ステートメントに分割します
- タグ入力を「OR」してアイテムをクエリします
- つまり、where('shirt' IN items.tags)OR('cotton' IN items.tags)
- これにより、たとえば、「シャツ1」のインスタンスが3つ、「シャツ3」のインスタンスが2つ返されます。
- その出力をマップ/リデュース
- マップ:emit(this._id、{...});
- 削減:_idの合計発生数をカウントします
- ファイナライズ:カウントされた合計で並べ替え
しかし、これをMongoクエリとして実装する方法、またはこれが最も効率的なアプローチであるかどうかはわかりません。