MongoDB ИЛИ операционные вопросы
Я сам изучаю MongoDB и нахожусь в странной ситуации. Вот запрос № 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 затруднительно. Пожалуйста, примите большие пробелы выше, где были скобки.
Когда я бегу
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
2 ответа
Параметр {"position":"Left Wing"} || {"position":"Right Wing"}
это выражение JavaScript, которое оценивает {"position":"Left Wing"}
потому что этот термин правдив. Так вот что вы на самом деле переходите в 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"]}})
Согласно моему пониманию с небольшим знанием монго.
|| команда оператора работает следующим образом
|| b -> если a имеет значение true, он просто передает значение a в db.players.find (a) и игнорирует b.
здесь в вашем случае 'a' относится к получению {"position": "Left Wing"}, поэтому он получает только документы "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
Надеюсь, поможет.
Спасибо,
рана