Как выбрать места на основе индекса и массива категорий geoNear 2dsphere, используя MongoDB? - PullRequest
0 голосов
/ 03 июля 2018

Это образец документа из коллекции mongoDB: -

{
    "place_id" : "57222c6f498e78e3bfe0a575",
    "title_AR" : "University Institute Hall",
    "title_EN" : "University Institute Hall",
    "description_AR" : "",
    "description_EN" : "",
    "best_photo" : "https://igx.4sqi.net/img/general/250x250/8862268_8oi3vr81Zm3ucytWjoSyvWXXS-7BUpNxKgyJvj0Lusc.jpg",
    "city_AR" : "Kolkata",
    "city_EN" : "Kolkata",
    "state_AR" : "West Bengal",
    "state_EN" : "West Bengal",
    "country" : "IN",
    "postal_code_AR" : "700073",
    "postal_code_EN" : "700073",
    "location_AR" : "7, Bankim Chatterjee St, Kolkata 700073, West Bengal, India",
    "location_EN" : "7, Bankim Chatterjee St, Kolkata 700073, West Bengal, India",
    "latitude" : 22.5744745110906,
    "longitude" : 88.3630291046031,
    "loc" : {
        "type" : "Point",
        "coordinates" : [ 
            88.3630291046031, 
            22.5744745110906
        ]
    },
    "website" : "",
    "email" : "",
    "contact_number_AR" : "+913322416214",
    "contact_number_EN" : "+913322416214",
    "ratings_AR" : "",
    "ratings_EN" : "",
    "no_of_comments_AR" : 0,
    "no_of_comments_EN" : 0,
    "categories" : "4d4b7104d754a06370d81259,5032792091d4c4b30a586d5c,4d4b7104d754a06370d81259,5032792091d4c4b30a586d5c",
    "category_array" : [ 
        "4d4b7104d754a06370d81259", 
        "5032792091d4c4b30a586d5c", 
        "4d4b7104d754a06370d81259", 
        "5032792091d4c4b30a586d5c"
    ],
    "created_date" : "2018-05-31 16:39:33",
    "modified_date" : "2018-05-31 16:39:33",
    "photo_saved" : 0,
    "tip_saved" : 0,
    "updated_at" : ISODate("2018-05-31T11:09:33.000Z"),
    "created_at" : ISODate("2018-05-31T11:09:33.000Z")
}

Массив категорий содержит все идентификаторы категорий, под которые попадает место.

"category_array" : [ 
            "4d4b7104d754a06370d81259", 
            "5032792091d4c4b30a586d5c", 
            "4d4b7104d754a06370d81259", 
            "5032792091d4c4b30a586d5c"
        ]

Я хочу выбрать места в зависимости от местоположения и категории. Вот мой сценарий: -

db.runCommand(
   {
     geoNear: "foursquare_places",
     near: { type: "Point", coordinates: [ 88.363892, 22.572645 ] },
     spherical: true,
     query: { category_array: { $all: ["5032792091d4c4b30a586d5c"] }},
     maxDistance: 500
   }
)

Теперь вот проблема. Согласно документу Монго : -

  1. Для точного совпадения массива, включая порядок элементов: -

    db.inventory.find( { tags: ["red", "blank"] } )

  2. Чтобы найти массив, который содержит как элементы «красный», так и «пустой», без учета порядка или других элементов в массиве: -

    db.inventory.find( { tags: { $all: ["red", "blank"] } } )

  3. В следующем примере запрашиваются все документы, где теги - это массив, содержащий в качестве одного из элементов строку «красный»

    db.inventory.find( { tags: "red" } )

Каким будет запрос для извлечения всех записей, чей category_array содержит один или все элементы следующего массива?

findArray = ['4d4b7104d754a06370d81259', '4d4b7104d754a06370d81259', 
            '5032792091d4c4b30a586d5c']

1 Ответ

0 голосов
/ 03 июля 2018

«или все» мало что значит для меня Предполагая, что это «хотя бы один из», вам нужно использовать $ в :

query: { category_array: { $in: [
    '4d4b7104d754a06370d81259', 
    '4d4b7104d754a06370d81259', 
    '5032792091d4c4b30a586d5c'
] } }

Вернет все документы, в которых category_array содержит хотя бы одну из 3 строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...