2017-04-11 11 views
1

Mongoを初めて使用しています.Mgoドライバを使用してGoでファセット検索を実装しようとしています。私は私のクエリとファセット数に一致するドキュメントの両方を取得する必要があります。ファウンデーションカウントを使用したMongo検索結果

私の現在の実装では、ドキュメントを取得するためにクエリを実行し、同じパラメータを使用してファセットカウントを取得する別のクエリを実行しますが、それは実際には効率が悪いようです。これを1つのステップで実行する良い方法はありますか?例えば

私は本のコレクションがある場合、:

[{ 
    title: "Book One", 
    author: "Author A", 
    numPages: 20, 
    type: "book" 
}, 
{ 
    title: "Book Two", 
    author: "Author B", 
    numPages: 40, 
    type: "book" 
}, 
... 
... 
... 
{ 
    title: "Magazine AA", 
    author: "Author A", 
    numPages: 10, 
    type: "magazine" 
}] 

最初に私は私のクエリに一致する文書を取得:

err = books.Find(bson.M{"$and": matches}).All(&results) 

その後、私は総額パイプラインと$を使用してクエリを繰り返しファセットカウントを取得するファセット:

err = Pipe([]bson.M{ 
    {"$match": bson.M{"$and": matches}}, 
    {"$facet": bson.M{ 
     "type":  []bson.M{bson.M{"$sortByCount": "$type"}}, 
     "author": []bson.M{bson.M{"$sortByCount": "$author"}, 
    }}, 
}).All(&facets) 

私はまた私の結果を書くことができます私はファセットカウントを決定するために使用することができる一時的なコレクションに変換しますが、それ以上の効率があるかどうかはわかりません。

答えて

1

これを行うには良い方法はありますか?

はい、ファセット検索を使用して面取りなしの結果を追加できます。例えば:最初$matchステージは既に文書の所望のサブセットにダウン濾過なるよう

pipeline := []bson.M{ 
       {"$match": bson.M{"type": bson.M{"$in": []string{"book", "magazine"}}}}, 
       {"$facet": bson.M{"type": []bson.M{{"$sortByCount":"$type"}}, 
            "author": []bson.M{{"$sortByCount":"$author"}}, 
            "unfaceted": []bson.M{{"$match": bson.M{} }}, 
           }, 
          }, 
      } 
err = collection.Pipe(pipeline).All(&resp) 

上記unfaceted$matchは、条件(空の)なしです。

{ 
    "type": [ 
    { 
     "_id": "book", 
     "count": 2 
    }, 
    { 
     "_id": "magazine", 
     "count": 1 
    } 
    ], 
    "author": [ 
    { 
     "_id": "Author A", 
     "count": 2 
    }, 
    { 
     "_id": "Author B", 
     "count": 1 
    } 
    ], 
    "unfaceted": [ 
    { 
     "_id": ObjectId(".."), 
     "title": "Magazine AA", 
     "author": "Author A", 
     "numPages": 10, 
     "type": "magazine" 
    }, 
    { 
     "_id": ObjectId(".."), 
     "title": "Book Two", 
     "author": "Author B", 
     "numPages": 40, 
     "type": "book" 
    }, 
    { 
     "_id": ObjectId(".."), 
     "title": "Book One", 
     "author": "Author A", 
     "numPages": 20, 
     "type": "book" 
    } 
    ] 
} 

今、あなたの代わりに別のクエリを送信するunfacetedセクションを反復処理することができます:あなたは、以下の結果が得られる

。オペレータの例と説明については、$facetも参照してください。

+0

素晴らしい!どうもありがとうございました。 – user3476370

関連する問題