0

MongoDB/Mongoose で "where $in" クエリを実行しようとしていますが、配列内のタグごとに 1 つの結果のみが返されます。のような並べ替え:

db.images.find( { hashtag : { $in : ['tag1', 'tag2', 'tag3'] } } );

そして、3 つの固有の結果が返されます。指定したタグのセットからそれぞれ。

[{name:'image1', hashtag:'tag1'},
{name:'image55', hashtag:'tag2'},
{name:'image99', hashtag:'tag3'}]

SQL では GROUP BY のようなものを使用しますが、MongoDB では Map/Reduce を行わないと同等のものを見つけることができません。

とにかくそれをするのですか?ありがとう。

--edit 私が望むものと同等の SQL は次のようになります。

SELECT * FROM images WHERE hashtag in ('tag1', 'tag2', 'tag3') GROUP BY hashtag;

または理想的には、MongoDB にはランダムな要素はありませんが、

SELECT * FROM images WHERE hashtag in ('tag1', 'tag2', 'tag3') GROUP BY hashtag ORDER BY rand();
4

2 に答える 2

0

配列を複数の結果にアンワインドできる集約パイプラインを含むMongoDBの2.2リリースを待っているようです。

http://www.mongodb.org/display/DOCS/Aggregation

于 2012-05-05T00:18:53.100 に答える
0

2.0 ではこれを行う方法を見つけることができませんが、2.2 (現在は開発バージョン 2.1.1 として利用可能 - テストのみで利用可能であり、本番環境では利用できません) では、集計フレームワークを使用すると、このように行うことができます (例として、私は他の方法が可能であると確信しています):

  db.images.aggregate( 
       {$match   : {hashtag: {$in:["tag1","tag2"]}}}, 
       {$group   : {_id:"$hashtag", name: {$first:"$name"}}},
       {$project : {hashtag:"$_id", name: "$name", _id:0}}
  )

どちらが返されますか:

{
         "result" : [
        {
            "hashtag" : "tag2",
            "name" : "1"
        },
        {
            "hashtag" : "tag1",
            "name" : "1"
        }
    ],
    "ok" : 1
  }

これは、ドキュメントの形式が {name:"xxx",hashtag:"tagX") であり、多くの名前が各ハッシュタグに対応していると仮定しています。集約パイプラインが行っていることは、$match を使用してワーキング セットを "tag1" または "tag2" のようなハッシュタグを持つものに限定することです。次に、ハッシュタグでグループ化し、各グループ化の $first の結果のみを保持するように指定します ($ last は別のオプションです) - これは、名前が 1 つだけである限り、どの名前が返されても気にしないことを前提としています。$project は、グループが必要とする _id をフィールド名 "hashtag" にマップするために使用されます。

于 2012-05-06T23:45:36.510 に答える