4

ここでいくつかのことが起こっています..私は2つのコレクションを持っています.testとtest1です。両方のコレクションのドキュメントには、いくつかのタグを含む配列フィールド (それぞれtagsおよびtags1 ) があります。これらのタグの共通部分を見つけ、 1 つのタグも一致する場合はコレクション test1 からドキュメント全体を取得する必要があります。

> db.test.find();
{
    "_id" : ObjectId("5166c19b32d001b79b32c72a"),
    "tags" : [
            "a",
            "b",
            "c"
    ]
}          
> db.test1.find();
{
    "_id" : ObjectId("5166c1c532d001b79b32c72b"),
    "tags1" : [
            "a",
            "b",
            "x",
            "y"
    ]
}
> db.test.find().forEach(function(doc){db.test1.find({tags1:{$in:doc.tags}})});

驚くべきことに、これは何も返しません。ただし、単一のドキュメントで試してみると、次のように機能します。

> var doc = db.test.findOne();
> db.test1.find({tags1:{$in:doc.tags}});
{ "_id" : ObjectId("5166c1c532d001b79b32c72b"), "tags1" : [ "a", "b", "x", "y" ] }

しかし、これは私が必要とするものの一部です。交差点も必要です。だから私はこれを試しました:

> db.test1.find({tags1:{$in:doc.tags}},{"tags1.$":1});
{ "_id" : ObjectId("5166c1c532d001b79b32c72b"), "tags1" : [ "a" ] }

しかし、「a」と「b」の両方がtags1にあるのに対し、「a」だけが返されました。位置演算子は最初の一致のみを返しますか? また、使用し$inても交点が正確に得られるわけではありません.どの配列が他の配列と比較されるかに関係なく、どのように交点を取得できますか(「a」と「b」を返す必要があります)。

これを実行できるオペレーターがいるとしましょう..

> db.test1.find({tags1:{$intersection:doc.tags}},{"tags1.$":1});
{ "_id" : ObjectId("5166c1c532d001b79b32c72b"), "tags1" : [ "a", "b" ] }

私の要件は、次のような同じクエリで、tags1 配列全体とこの交差点が必要なことです。

> db.test1.find({tags1:{$intersection:doc.tags}},{"tags1":1, "tags1.$":1});
{ "_id" : ObjectId("5166c1c532d001b79b32c72b"), "tags1": [ "a", "b", "x", "y" ],
"tags1" : [ "a", "b" ] }

しかし、これは無効な json です。キーの名前を変更することは可能ですか、それとも集計フレームワークを介してのみ可能ですか (および異なるコレクション間で可能ですか?)? で上記のクエリを試しました$in。しかし、それはあたかも"tags:1"投影を完全に無視したかのように振る舞いました。

PS: テスト 1 には少なくとも 10,000 のドキュメントがあり、テストにはごく少数 (<10) のドキュメントがあります。そして、このクエリはリアルタイムなので、mapreduce は避けたいです :)

助けてくれてありがとう!

4

3 に答える 3

-1

これをリアルタイムで実行したい場合は、1 つのスレッドでのみ実行され、非常に遅い (シングル スレッド) 必要があるサーバーサイド Javascript から離れることを検討する必要があります (これは、v2.4、http://docs. mongodb.org/manual/core/server-side-javascript/ )。

位置演算子は、最初に一致した/現在の値のみを返します。内部実装を知らなければ、パフォーマンスの観点から、ドキュメントが既に一致として評価されている場合、さらに一致基準を探すことさえ意味がありません。だから私はあなたがこれに行くことができるとは思わない。

検索にデカルト積が必要かどうかはわかりませんが、いくつかのテスト 1 ドキュメント タグを 1 つに結合してから、test1 で $in 検索を行い、一致するすべてのドキュメントを返すことを検討します。ローカル マシンでは、ドキュメントの交差を生成する複数のスレッドを持つことができます。

test1 とテスト コレクションが変更される頻度に応じて、このクエリを実行して、この情報を事前に計算する場合があります。これにより、交差点情報を含むフィールドに対して簡単にクエリを実行できます。

2 つのフィールド名tags1があるため、ドキュメントは無効です

于 2013-04-15T14:06:33.580 に答える
-1

Mongo には、配列の交差を取得する固有の機能はありません。アドホック クエリを本当に使用する必要がある場合は、クライアント側で交差点を取得します。

一方、Map-Reduce を使用して、その出力をコレクションとして保存することを検討してください。セクションで返されたオブジェクトを拡張してfinalize、交差するタグを追加できます。Cron MR を数秒ごとに実行します。クライアント側でクエリできる永続的なコレクションの利点が得られます。

于 2013-04-15T14:47:52.300 に答える