2016-09-26 8 views
0

問題を示していますモンゴ次のように

私のクエリ:

db.goods.find({tags:{$in:["white","black","gray"]}}).pretty(); 

とデータが返さ:

{ 
    "id":1, 
    "tags": [ 
     "black", 
     "blue" 
    ] 
} 
{ 
    "id":2, 
    "tags": [ 
     "white", 
     "gray" 
    ] 
} 
{ 
    "id":3, 
    "tags": [ 
     "gray", 
     "black", 
     "white" 
    ] 
} 

今、私は、クエリがrevelenceで注文したいですつまり、_id:3がタグフィールドの最も一致するレコードであり、_id:2が続きます。

問題を手伝ってもらえますか?

答えて

1

を使用することによって解決することができます。

db.goods.aggregate([ 
    {$match: {tags: {$in: ["white","gray","black"]}}}, 
    {$project: {"tags":1, "tagsCopy":"$tags"}}, 
    {$unwind: "$tagsCopy"}, 
    {$match: {tagsCopy: {$in: ["white","gray","black"]}}}, 
    {$group: { 
     _id:"$_id", 
     counter:{$sum:1}, 
     tags:{"$first":"$tags"} 
    }}, 
    {$sort:{counter:-1}}, 
    {$project: {"tags":1}} 
]); 
+1

はい、これはまさに正しい解決策です! –

0

は、あなたが望む結果を得るために、次の集計クエリを使用することができます集約

db.goods.aggregate([ 
    {$match: {tags: {$in: ["white","gray","black"]}}}, 
    {$unwind: "$tags"}, 
    {$match: {tags: {$in: ["white","gray","black"]}}}, 
    {$group: { 
     _id:"$_id", 
     matches:{$sum:1}, 
     tags: {$push:"$tags"} 
    }}, 
    {$sort:{matches:-1}} 
]); 
+0

良い解決策もあります。 –