【问题标题】:sails.js query json objects inside table columnsails.js 查询表列内的 json 对象
【发布时间】:2015-07-03 06:44:55
【问题描述】:

所以这一定是一个奇怪的问题,我想让sails.js ORM 搜索类似以下的内容

如果这是以下查询的结果

Venue.findOne({id: 125274827508536}).exec()

返回 >

{
   "id": "125274827508536",
   "attire": "Casual",
   "can_post": false,
   "category": "Restaurant/cafe",
   "category_list": [
      {
         "id": "200742186618963",
         "name": "Vegetarian & Vegan Restaurant"
      },
      {
         "id": "192108214153222",
         "name": "Breakfast & Brunch Restaurant"
      },
      {
         "id": "188296324525457",
         "name": "Sandwich Shop"
      }
   ],
   "checkins": 562,
   "cover": {
      "cover_id": 356427064393310,
      "offset_x": 0,
      "offset_y": 13,
      "source": "https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-xaf1/t31.0-8/s720x720/460144_356427064393310_1179113344_o.jpg",
      "id": "356427064393310"
   },
   "culinary_team": "Ramy Abu-Yousef : Owner, Chef\nDallas Jones: Chef",
   "description": "Unique Sandwiches\nDelicious Salads\nHomemade Soups (4 daily)\nFresh Fruit Smoothies\nMilkshakes\nMOUSTACHE WALL OF FAME",
   "general_manager": "Ramy Abu-Yousef & Syndey Friedemann",
   "has_added_app": false,
   "hours": {
      "mon_1_open": "08:00",
      "mon_1_close": "22:00",
      "tue_1_open": "08:00",
      "tue_1_close": "22:00",
      "wed_1_open": "08:00",
      "wed_1_close": "22:00",
      "thu_1_open": "08:00",
      "thu_1_close": "22:00",
      "fri_1_open": "08:00",
      "fri_1_close": "22:00",
      "sat_1_open": "08:00",
      "sat_1_close": "22:00",
      "sun_1_open": "08:00",
      "sun_1_close": "22:00"
   },
   "is_community_page": false,
   "is_published": true,
   "likes": 540,
   "link": "https://www.facebook.com/JohnnyBarrs",
   "location": {
      "city": "Queenstown",
      "country": "New Zealand",
      "latitude": -45.032691433795,
      "longitude": 168.66154298959,
      "street": "15 Church Street",
      "zip": "9300"
   },
   "name": "Johnny Barr's",
   "parking": {
      "lot": 1,
      "street": 1,
      "valet": 0
   },
   "payment_options": {
      "amex": 1,
      "cash_only": 0,
      "discover": 0,
      "mastercard": 1,
      "visa": 1
   },
   "phone": "+64 (0)3 409 0169",
   "price_range": "$$ (10-30)",
   "restaurant_services": {
      "delivery": 1,
      "catering": 0,
      "groups": 1,
      "kids": 1,
      "outdoor": 0,
      "reserve": 0,
      "takeout": 1,
      "waiter": 0,
      "walkins": 1
   },
   "restaurant_specialties": {
      "breakfast": 1,
      "coffee": 1,
      "dinner": 1,
      "drinks": 1,
      "lunch": 1
   },
   "talking_about_count": 2,
   "username": "JohnnyBarrs",
   "website": "www.johnnybarrs.com",
   "were_here_count": 562
}

现在我需要帆做的是以下

Venue.findOne({'restaurant_services': {'delivery': 1}).exec()

要返回与我上面显示的相同的对象,

有什么想法吗?

【问题讨论】:

    标签: mysql sql orm sails.js waterline


    【解决方案1】:

    如果您的适配器是 mongo,那么您可以开箱即用

    Venue.findOne({'restaurant_services.delivery': 1}).exec()
    

    因此,如果您可以将数据转换为其他来源来执行此查询,则应考虑您的选择。

    如果不是,并且您的适配器是基于 SQL 的,那么它会更加困难,并且需要有关您的用例的更多信息来决定最有效的选项。

    例如,如果您可以将查询限制在 SQL 数据库中的几个索引字段,那么您可以使用 lodash 在您的记录中查找您的记录。

    Venue.find({/*limiting criteria to bring down the number of results*/}).exec(function(err,results){/* JSON.parse(results) then use lodash to find the final result*/})
    

    另一种选择是

    Venue.find({restaurant_services: {contains: 'delivery: 1'}}).exec()
    

    这是一个开箱即用的想法,但可能会奏效。

    再次很大程度上取决于您的设置、它的索引方式以及需要找到多少个场所。

    【讨论】:

    • 我正在使用sails-mysql 适配器。请问还有什么其他信息可以让您获得正确的功能?
    • 另外,如何通过检查其中一个对象是否为空来找到记录?例如有时'restaurant_services' could be just a {}请告诉我
    • 视情况而定。如果您想将数据作为 SQL 列内的本机字符串查询,并且您想找到一个空值,您可以执行 {'restaurant_services: {contains: 'delivery: null'}'},这假设您找不到仅将数据转换为新数据库的解决方案。我推荐。
    • 在使用 Mode.query 或 ORM 时是否应该担心 sql 注入?或者我应该始终使用 _.escape 来处理从客户端传递的值?
    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多