【问题标题】:Morphia to return List of strings which are the fields of all documentsMorphia 返回字符串列表,这些字符串是所有文档的字段
【发布时间】:2012-08-14 12:27:57
【问题描述】:

如果我有一个包含以下元素的集合

@Entity
public void MyEntity{
  public String name;
  public String type;
  ...
}

我想返回不是元素的List<String>(或Set),而只是它们的name 字段。

List<String> allNames = datasotre.find(MyEntity.class).asList("name");

这是示例查询,Morphia 数据存储没有这种方法。

【问题讨论】:

    标签: java mongodb morphia


    【解决方案1】:

    要限制返回的字段,请在 Query 上调用“retrivedFields”方法。例如,只获取所有 MyEntity 对象的 name 字段:

    datastore.find(MyEntity.class).retrievedFields( true, "name").asList()
    

    编辑 - 只要您不介意列表仅包含唯一值(即没有重复名称),您就可以使用以下查询获取列表字符串:

    DBCollection m = datastore.getCollection( MyEntity.class );
    List names = m.distinct( "name", new BasicDBObject() );
    

    “名称”列表将只包含字符串。

    【讨论】:

    • 我想要返回 List 的东西,而不是 List
    • morphia 中没有这样的功能,我也不明白为什么要添加它。如果您想要名称字段中所有值的不同列表,则可以按照上面的建议直接使用驱动程序。
    【解决方案2】:

    这里的问题是“键”没有实际的查询。查询都返回“键/值对”。

    理论上,datastore.find() 中的字段应该映射到MyEntity 中的字段,因此您可以只使用反射。但是,如果您有其他人从不同的地方写入数据库,他们可能已经植入了额外的表。

    如果是这种情况,您将需要运行 Map/Reduce 以获取所有“键”名称的列表。

    a sample here

    【讨论】:

      【解决方案3】:

      您正在寻找datastore.find(MyEntity.class).retrievedFields(true, "name").asList();。这将包含 _id 和 name 属性。

      http://code.google.com/p/morphia/wiki/Query#Ignoring_Fields

      【讨论】:

      • 我想要返回 List 的东西,而不是 List
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2013-08-06
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      相关资源
      最近更新 更多