如何使用AngularJS和RavenDB将ID作为索引的一部分进行检索?

时间:2014-10-09 08:15:02

标签: angularjs ravendb ravendb-http

我正在关注Pro AngularJS的教程,并且我正在从HTTP API中检索一些产品。我没有使用Deployd,而是希望使用RavenDB

根据this post的建议,我可以使用动态索引来获取所有这样的产品:

http://localhost:8080/databases/Catalogue/indexes/dynamic/Products

这导致JSON像这样:

{
  Results: [
  {
    name: "Kayak",
    description: "A boat for one person",
    category: "Watersports",
    price: 275,
    @metadata: {
        Raven-Entity-Name: "Products",
        @id: "products/1",
        Temp-Index-Score: 0.882217,
        Last-Modified: "2014-10-07T20:26:31.4436923Z",
        Raven-Last-Modified: "2014-10-07T20:26:31.4436923",
        @etag: "01000000-0000-0001-0000-000000000001"
    }
},
{ ... }

AngularJS的样本会产生这样的结果:

 $http.get(dataUrl)
      .success(function(result) { 
         $scope.products = result.Results;
      });

使用此方法时,ID将存储为product["@metadata"].["@id"],这在受影响的网页上有点难以绑定,而不是product.id。在尝试显示ID时,将ID重新发布以便从篮子中删除,您可以执行以下操作:

<table>
   <tr ng-repeat="product in products">
      <td>{{product["@metadata"]["@id"]}}</td>
      <!-- other columns -->
   </tr>
</table>

解决此问题的另一种方法是基本上动态创建ID,如下所示:

   $http.get(dataUrl)
        .success(function (result) {

            var localResults = [];

            for (var i = 0; i < result.Results.length; i++) {
                localResults.push(result.Results[i]);
                localResults[i].id = result.Results[i]["@metadata"]["@id"];
            };

            $scope.data = {
                products: localResults
            };
        });

我尝试创建明确调出ID的索引,例如:

// Index: Products/All
from product in docs.Products
select new {
   id = product.Id,
   name = product.Name,
   category = product.Category,
   description = product.Description,
   price = product.Price
}

但该文件格式与以前完全相同。


我的问题是:

RavenDB是否可以仅发出文档中的字段,即使是通过a)忽略元数据的特定索引或变换器,或b)明确地将ID添加为字段。

1 个答案:

答案 0 :(得分:2)

对于问题的第一部分,索引不会改变结果只显示查询数据的方式。因此,使用&#34; id&#34;创建索引领域不会做你想要的。如果要更改结果,则需要使用变压器。因此,在您的情况下,您将创建一个变换器,如:

from product in results
select new
{
   id = product.Id,
   name = product.Name,
   category = product.Category,
   description = product.Description,
   price = product.Price
}

比你需要将变压器绑定到你的索引。所以你的网址看起来像这样:

http://localhost:8080/databases/Catalogue/indexes/dynamic/Products?resultsTransformer=ProductTransformer

希望有所帮助。

作为替代建议,如果您不想使用变压器。在角度你可以做这样的事情:

<table>
   <tr ng-repeat="product in products">
      <td>{{getId(product)}}</td>
      <!-- other columns -->
   </tr>
</table>

然后在$ scope:

$scope.getId = function(product){
    return product["@metadata"]["@id"];
}