Spring MongoDb:使用bean类创建有关未知字段的索引

时间:2018-11-15 14:44:05

标签: spring spring-data-mongodb

我遇到了一个我不知道是否有可能做的问题。

我需要将文档类与已知字段一起存储,但是我还需要将其与未知字段一起存储:

@Document
public class Metadata {

    @Indexed
    private String user;

    private Object metadata;
}

所有这些未知字段都存储在metadata字段中。

但是,我认识其中的一个人。我的意思是,在metadata字段中,将有用户想要的任何内容,但是应用程序知道某些字段。

我想知道如何为这些未知的metadata字段创建索引。

示例:

{ user: user, metadata: {known: v, unknown: nv}} }

我想在metadata.known字段中创建索引。

问题是,由于未将此字段设置为Java bean字段,因此我无法将其注释为@Indexed

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

作为猜测,为什么不将 private void saveUserInformation() { name = mNameField.getText().toString(); phone = mPhoneField.getText().toString(); Map userInfo = new HashMap(); userInfo.put("name", name); userInfo.put("phone", phone); mUserDatabase.updateChildren(userInfo); if(resultUri != null){ StorageReference filepath = FirebaseStorage.getInstance().getReference().child("profileImages").child(userId); Bitmap bitmap = null; try { bitmap = MediaStore.Images.Media.getBitmap(getApplication().getContentResolver(), resultUri); } catch (IOException e) { e.printStackTrace(); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 20, baos); byte[] data = baos.toByteArray(); UploadTask uploadTask = filepath.putBytes(data); uploadTask.addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { finish(); } }); uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { Uri downloadUrl = taskSnapshot.getDownloadUrl(); Map userInfo = new HashMap(); userInfo.put("profileImageUrl", downloadUrl.toString()); mUserDatabase.updateChildren(userInfo); finish(); return; } }); }else{ finish(); } } 分成两部分?

一个用于可索引的已知字段,另一个用于不可索引的未知字段。例如:

metadata Object

因此,您将获得类似于:

@Document
public class Metadata {

  @Indexed
  private String user;

  @Indexed
  private Object knownMetadata;

  private Object unknownMetadata;

}

答案 1 :(得分:0)

对于已知字段,您可以使用复合索引注释创建索引。它实际上并不强制您具有复合索引。

考虑此bean:

@CompoundIndexes({
    @CompoundIndex(name="my_index", def = "{'metadata.known' : 1}", background=true),
})
@Document
@Document
public class Metadata {

    @Indexed
    private String user;

    private Object metadata;
}

现在将在字段metadata.known上创建索引-您可以在任何已知字段上执行此操作并在注释中定义它们。