2017-07-25 152 views
0

我在走郎下面的查詢工作正常:

query["name"] = bson.M{"$regex": searchStr, "$options": "i"} 
query["likes"] = userSession.Id 
c.Find(query).Skip(0).Limit(2).Select(bson.M{"name":1, "profile":1, "description":1, "user_id":1, "likes":1}).Sort("-pro", "-check").All(&business); 

然後我試圖使用聚合框架編寫相同的查詢:

query["name"] = bson.M{"$regex": searchStr, "$options": "i"} 
query["likes"] = userSession.Id 
oe := bson.M{ 
    "$match" :query, 
} 
oa := bson.M{ 
    "$project": bson.M {"pro": 1, "check": 1, "name":1, "profile":1, "description":1, "user_id":1, "likes":1, "nrLikes": bson.M{ "$size": "$likes" }, "city": 1, "country": 1, "industry": 1}, 
} 
ol := bson.M{ 
    "$limit" :pageSize, 
} 
os := bson.M{ 
    "$skip" :skips, 
} 
or := bson.M{ 
    "$sort" : bson.M {"pro": -1, "check": -1}, 
} 

pipe := c.Pipe([]bson.M{oe, oa, or, os, ol }) 

pipe.All(&business) 

第二個查詢在90%的時間內正常工作,但10%的時間返回不同的結果順序。

有什麼想法?

後來編輯:這裏是resuls

[]bson.M{ 
{ 
    "description": "<p>sasdfdasf</p>", 
    "profile":  []interface {}{ 
     "rKwMmXPWheGczwvGn2TzSRU7jRorhorKwMmXPWheGczwvGn2TzSRU7jRorho=0.jpg", 
    }, 
    "likes": []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "nrLikes": int(1), 
    "name":  "ediloc.com2", 
    "city":  "Calimanesti", 
    "industry": "Automotive", 
    "_id":  "Yo\xd4f\x1a\xa9Q|w\tG^", 
    "user_id": "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "country": "Romania", 
}, 
{ 
    "_id":   "Yo\xc7\xd7\x1a\xa9Qy1['\xea", 
    "user_id":  "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "name":  "ediloc.com", 
    "country":  "Romania", 
    "description": "<p>a</p>", 
    "profile":  []interface {}{ 
     "1ssSySNRZwGJJwqzXghL6qzAVfWZis1ssSySNRZwGJJwqzXghL6qzAVfWZis=1.jpg", 
    }, 
    "likes": []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "nrLikes": int(1), 
    "city":  "Calimanesti", 
    "industry": "Accounting", 
}, 
} 


[]bson.M{ 
{ 
    "likes": []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "_id":  "Yo\xd4f\x1a\xa9Q|w\tG^", 
    "name": "ediloc.com2", 
    "city": "Calimanesti", 
    "country": "Romania", 
    "profile": []interface {}{ 
     "rKwMmXPWheGczwvGn2TzSRU7jRorhorKwMmXPWheGczwvGn2TzSRU7jRorho=0.jpg", 
    }, 
    "user_id":  "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "industry": "Automotive",, 
    "nrLikes":  int(1), 
}, 
{ 
    "_id":  "Yo\xc7\xd7\x1a\xa9Qy1['\xea", 
    "user_id": "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "industry": "Accounting", 
    "profile": []interface {}{ 
     "1ssSySNRZwGJJwqzXghL6qzAVfWZis1ssSySNRZwGJJwqzXghL6qzAVfWZis=1.jpg", 
    }, 
    "likes": []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "nrLikes":  int(1), 
    "name":  "ediloc.com", 
    "city":  "Calimanesti", 
    "country":  "Romania", 
    "description": "<p>a</p>", 
}, 
} 


[]bson.M{ 
{ 
    "nrLikes":  int(1), 
    "user_id":  "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "description": "<p>a</p>", 
    "profile":  []interface {}{ 
     "1ssSySNRZwGJJwqzXghL6qzAVfWZis1ssSySNRZwGJJwqzXghL6qzAVfWZis=1.jpg", 
    }, 
    "country": "Romania", 
    "industry": "Accounting", 
    "likes": []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "_id": "Yo\xc7\xd7\x1a\xa9Qy1['\xea", 
    "name": "ediloc.com", 
    "city": "Calimanesti", 
}, 
{ 
    "name":  "ediloc.com2", 
    "industry": "Automotive", 
    "description": "<p>sasdfdasf</p>", 
    "likes":  []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "user_id": "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "city": "Calimanesti", 
    "country": "Romania", 
    "profile": []interface {}{ 
     "rKwMmXPWheGczwvGn2TzSRU7jRorhorKwMmXPWheGczwvGn2TzSRU7jRorho=0.jpg", 
    }, 
    "nrLikes": int(1), 
    "_id":  "Yo\xd4f\x1a\xa9Q|w\tG^", 
}, 
} 

Pro和檢查領域是IN32,具有較高的親場數的文件應在具有較高檢查領域的文件具有優先權。

+1

你是什麼'pro'字段的數據類型?你可以包括一些排序不正確的例子輸出嗎?如果結果不可預測,那麼您可能混合了根據[BSON比較/排序順序]排序的數據類型(https://docs.mongodb.com/manual/reference/bson-type-comparison-order/#bson -types對比順序)。 – Stennie

+0

@Stennie我編輯了我的問題並添加了輸出。此外,檢查和專業領域都是int32。並且繼續查找使用cursor.sort()的第一個查詢正常工作。 –

+0

你是否改變了輸出?除非我錯過了一些東西,似乎當前的結果文檔沒有你正在排序的'pro'和'check'字段。 – Stennie

回答

0

確保你有你的排序管道階段之前你的限制&跳過階段。您只能通過排序輸入上的限制/跳過纔可靠地獲得相同的結果。

編輯

意識到你正在使用bson.M {"pro": -1, "check": -1}來定義排序次序。 Go中沒有指定地圖的迭代順序,並且可以更改。因此,這可能是你得到不一致結果的原因。

嘗試將其更改爲bson.D,以便保持排序的列順序。

它可以幫助您瞭解查詢Sort方法如何根據您提供的字符串構造這個方法。

您的使用情況下,你會改變or變量:

or := bson.M{ 
    "$sort": bson.D{ 
     bson.DocElem{Name: "pro", Value: -1}, 
     bson.DocElem{Name: "check", Value: -1}, 
    }, 
} 
+0

是的,我正在做skip和limit之前的排序。 –

+0

對不起,你的確如此。我只是讀取了聲明順序,而不是它們傳遞給'c.Pipe'的順序。順便說一下,該建議是在跳過之前限制的(請參閱[上一個問題](https://stackoverflow.com/questions/24160037/skip-and-limit-in-aggregation-framework))。不要以爲這會是你的問題。 –

+0

我現在嘗試過,但它沒有改變任何東西。 一個文件有親:1和檢查:0和另一個有親:0和檢查:1 你可以在這裏看到:2message。com:8080/search/business?q = e如果你刷新頁面很多次 –