2016-09-14 4 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"}, чтобы он извлекал только документы «Левого крыла».

  • где $ или: подготавливает индексы к каждому условию и получает комбинированные результаты для «Левого крыла» и «Правого крыла».

Попробуйте приведенные ниже команды на оболочке манго, я думаю, что это дает лучшую идею.

> {$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"]}}) 
Смежные вопросы