MongoDB ИЛИ операционные вопросы

Я сам изучаю MongoDB и нахожусь в странной ситуации. Вот запрос № 1

  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

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

Надеюсь, поможет.

Спасибо,
рана

Другие вопросы по тегам