【问题标题】:Querying nested objects in PouchDB在 PouchDB 中查询嵌套对象
【发布时间】:2017-09-19 18:04:33
【问题描述】:

我在 Google 上搜索了一些示例和教程,但找不到任何明确的示例。

我从我的服务器收到这样的 JSON 响应:

var heroes = [
{
    id: 5,
    name: 'Batman',
    realName: 'Bruce Wayne',
    equipments: [
        {
            type: 'boomarang',
            name: 'Batarang',
        },

        {
            type: 'cloak',
            name: 'Bat Cloak',
        },

        {
            type: 'bolas',
            name: 'Bat-Bolas',
        }       
    ]
},
{
    id: 6,
    name: 'Cat Woman',
    realName: 'Selina Kyle',
    equipments: [
        {
            type: 'car',
            name: 'Cat-illac',
        },

        {
            type: 'bolas',
            name: 'Cat-Bolas',
        }      
    ]
}
];

我想查询例如:“获取装备类型为 bolas 的英雄” 它应该在一个数组中返回两个英雄对象。

我知道这是不对的,但我想做的是形成这样的地图功能:

function myMapFunction(doc) {

    if(doc.equipments.length > 0) {
        emit(doc.equipment.type);    
    }

}

db.query(myMapFunction, {
    key: 'bolas',
    include_docs: true
}).then(function(result) {
    console.log(result);
}).catch(function(err) {
    // handle errors
});

有可能吗?如果没有,我有什么选择?

P.S:我还检查了 LokiJS 和 underscoreDB。然而,PouchDB 看起来更复杂,并且能够进行此类查询。

提前谢谢大家

【问题讨论】:

    标签: javascript pouchdb nosql


    【解决方案1】:

    您的地图功能应该是:

    function myMapFunction(doc) {
      doc.equipments.forEach(function (equipment) {
        emit(equipment.type);
      });
    }
    

    然后查询,你使用{key: 'bolas'}:

    db.query(myMapFunction, {
      key: 'bolas', 
      include_docs: true
    }).then(function (result) {
      // got result
    });
    

    那么你的结果会是这样的:

    {
      "total_rows": 5,
      "offset": 0,
      "rows": [
        {
          "doc": ...,
          "key": "bolas",
          "id": ...,
          "value": null
        },
        {
          "doc": ...,
          "key": "bolas",
          "id": ...,
          "value": null
        }
      ]
    }
    

    还要确保先创建索引!详情在PouchDB map/reduce guide :)

    【讨论】:

    • 非常感谢诺兰。我还将阅读您关于 PouchDB 的 12 个技巧的博客 =)
    • 我还读到“总是问自己,是否可以使用 allDocs() 实现”类似的内容。在这种情况下,有可能吗?虽然我问的是你,而不是我自己......
    • 在这种情况下,这可能是不可能的,因为每个超级英雄都可以拥有多种武器。如果他们只有一种武器,那么是的。 :)
    • 再次感谢诺兰。我还阅读了有关主键以及如何滥用它们的信息。我也会记住这个技巧。
    猜你喜欢
    • 1970-01-01
    • 2015-05-31
    • 2015-01-13
    • 2021-12-14
    • 2021-10-02
    • 2013-06-03
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多