ここでいくつかのことが起こっています..私は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 は避けたいです :)
助けてくれてありがとう!