2016-09-14 224 views
1

我正在學習MongoDB,我發現自己處於一種奇怪的情況。這裏的查詢#1MongoDB OR操作問題

  1. 當我運行db.players.find({$or: [{"position":"Left Wing"}, {"position":"Right Wing"}]}).pretty(),在我的樣本數據集,這是結果:

    "_id" : ObjectId("57d9a212698d3e0bd0f5a245"), 
    "position" : "Right Wing", 
    "id" : 8465166, 
    "weight" : 200, 
    "height" : "6' 0\"", 
    "imageUrl" : "http://1.cdn.nhle.com/photos/mugs/8465166.jpg", 
    "birthplace" : "Seria, BRN", 
    "age" : 37, 
    "name" : "Craig Adams", 
    "birthdate" : "April 26, 1977", 
    "number" : 27 
    
    
    "_id" : ObjectId("57d9a212698d3e0bd0f5a246"), 
    "position" : "Right Wing", 
    "id" : 8475761, 
    "weight" : 195, 
    "height" : "6' 2\"", 
    "imageUrl" : "http://1.cdn.nhle.com/photos/mugs/8475761.jpg", 
    "birthplace" : "Gardena, CA, USA", 
    "age" : 23, 
    "name" : "Beau Bennett", 
    "birthdate" : "November 27, 1991", 
    "number" : 19 
    
    
    "_id" : ObjectId("57d9a212698d3e0bd0f5a247"), 
    "position" : "Left Wing", 
    "id" : 8471260, 
    "weight" : 202, 
    "height" : "6' 1\"", 
    "imageUrl" : "http://3.cdn.nhle.com/photos/mugs/8471260.jpg", 
    "birthplace" : "Meadow Lake, SK, CAN", 
    "age" : 29, 
    "name" : "Blake Comeau", 
    "birthdate" : "February 18, 1986", 
    "number" : 17 
    
    
    "_id" : ObjectId("57d9a212698d3e0bd0f5a249"), 
    "position" : "Right Wing", 
    "id" : 8471703, 
    "twitterURL" : "https://twitter.com/S9Downie", 
    "weight" : 191, 
    "height" : "5' 11\"", 
    "imageUrl" : "http://1.cdn.nhle.com/photos/mugs/8471703.jpg", 
    "birthplace" : "Newmarket, ON, CAN", 
    "twitterHandle" : "S9Downie", 
    "age" : 28, 
    "name" : "Steve Downie", 
    "birthdate" : "April 03, 1987", 
    "number" : 23 
    
    
    "_id" : ObjectId("57d9a212698d3e0bd0f5a24a"), 
    "position" : "Right Wing", 
    "id" : 8466393, 
    "weight" : 205, 
    "height" : "6' 1\"", 
    "imageUrl" : "http://2.cdn.nhle.com/photos/mugs/8466393.jpg", 
    "birthplace" : "Laval, QC, CAN", 
    "age" : 35, 
    "name" : "Pascal Dupuis", 
    "birthdate" : "April 07, 1979", 
    "number" : 9 
    
    
    "_id" : ObjectId("57d9a212698d3e0bd0f5a24b"), 
    "position" : "Right Wing", 
    "id" : 8471887, 
    "weight" : 189, 
    "height" : "5' 11\"", 
    "imageUrl" : "http://1.cdn.nhle.com/photos/mugs/8471887.jpg", 
    "birthplace" : "Sollentuna, SWE", 
    "age" : 28, 
    "name" : "Patric Hornqvist", 
    "birthdate" : "January 01, 1987", 
    "number" : 72 
    
    
    "_id" : ObjectId("57d9a212698d3e0bd0f5a24c"), 
    "position" : "Left Wing", 
    "id" : 8470543, 
    "weight" : 195, 
    "height" : "6' 0\"", 
    "imageUrl" : "http://3.cdn.nhle.com/photos/mugs/8470543.jpg", 
    "birthplace" : "Regina, SK, CAN", 
    "age" : 35, 
    "name" : "Chris Kunitz", 
    "birthdate" : "September 26, 1979", 
    "number" : 14 
    
    
    "_id" : ObjectId("57d9a212698d3e0bd0f5a24f"), 
    "position" : "Left Wing", 
    "id" : 8474102, 
    "twitterURL" : "https://twitter.com/DP_57", 
    "weight" : 200, 
    "height" : "6' 0\"", 
    "imageUrl" : "http://3.cdn.nhle.com/nhl/en/v3/photos/mugs/8474102.jpg", 
    "birthplace" : "Sherbrooke, QC, CAN", 
    "twitterHandle" : "DP_57", 
    "age" : 26, 
    "name" : "David Perron", 
    "birthdate" : "May 28, 1988", 
    "number" : 39 
    

    對不起,格式化JSON文件是困難的。請把上面的較大差距假設爲括號。

  2. 當我運行db.players.find({"position":"Left Wing"} || {"position":"Right Wing"}).pretty(),結果是:

    "_id" : ObjectId("57d9a212698d3e0bd0f5a247"), 
    "position" : "Left Wing", 
    "id" : 8471260, 
    "weight" : 202, 
    "height" : "6' 1\"", 
    "imageUrl" : "http://3.cdn.nhle.com/photos/mugs/8471260.jpg", 
    "birthplace" : "Meadow Lake, SK, CAN", 
    "age" : 29, 
    "name" : "Blake Comeau", 
    "birthdate" : "February 18, 1986", 
    "number" : 17 
    
    
    "_id" : ObjectId("57d9a212698d3e0bd0f5a24c"), 
    "position" : "Left Wing", 
    "id" : 8470543, 
    "weight" : 195, 
    "height" : "6' 0\"", 
    "imageUrl" : "http://3.cdn.nhle.com/photos/mugs/8470543.jpg", 
    "birthplace" : "Regina, SK, CAN", 
    "age" : 35, 
    "name" : "Chris Kunitz", 
    "birthdate" : "September 26, 1979", 
    "number" : 14 
    
    
    "_id" : ObjectId("57d9a212698d3e0bd0f5a24f"), 
    "position" : "Left Wing", 
    "id" : 8474102, 
    "twitterURL" : "https://twitter.com/DP_57", 
    "weight" : 200, 
    "height" : "6' 0\"", 
    "imageUrl" : "http://3.cdn.nhle.com/nhl/en/v3/photos/mugs/8474102.jpg", 
    "birthplace" : "Sherbrooke, QC, CAN", 
    "twitterHandle" : "DP_57", 
    "age" : 26, 
    "name" : "David Perron", 
    "birthdate" : "May 28, 1988", 
    "number" : 39 
    

爲什麼是這種差異,考慮到他們倆都是OR操作?請幫我理解它。

的Windows 10/MongoDB的上的IntelliJ

回答

1

按我與小蒙戈知識的理解。

  • ||操作員命令以如下方式工作

  • a || b - >如果a是真的,它只是將值a傳遞給db.players.find(a)並忽略b。

  • 這裏你的情況'a'是指獲得{「position」:「Left Wing」},因此它只檢索「左翼」文檔。

  • 其中as $ or:爲每個條件準備索引並獲取「左翼」和「右翼」的組合結果。

在mongo shell上嘗試下面的命令,我認爲它提供了一些更好的主意。

> {$or: [(1==1), (2==1)]} 
[ true, false ] 
> (1==1) || (2==1) 
true 
> {$or: [(2==1), (1==1)]} 
[ false, true ] 
> (2==1) || (1==1) 
true 

希望它有幫助。

謝謝,
拉納

1

{"position":"Left Wing"} || {"position":"Right Wing"}的參數是JavaScript表達式計算結果爲{"position":"Left Wing"}因爲該術語是truthy。所以這就是你實際上傳入的find,這就是爲什麼你只在該查詢中獲得"Left Wing"文檔。

你可以做的外殼看到:

> var query = {"position":"Left Wing"} || {"position":"Right Wing"} 
> query 
{ "position" : "Left Wing" } 

但你也可以簡化您的$or查詢中使用$in代替:

db.players.find({"position": {$in: ["Left Wing", "Right Wing"]}})