- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是将 MongoDB
文档转换为一种类型:
getCollection
javadoc
说:
/**
* Gets a collection, with a specific default document class.
*
* @param collectionName the name of the collection to return
* @param documentClass the default class to cast any documents returned from the database into.
* @param <TDocument> the type of the class to use instead of {@code Document}.
* @return the collection
*/
<TDocument> MongoCollection<TDocument> getCollection(String collectionName, Class<TDocument> documentClass);
这是我的实现:
public class AccountDAO {
public static FindIterable<AccountDTO> accountPersist(AccountDTO accountDTO){
MongoCollection<AccountDTO> accountDataCollection = Utils.getDbCollection();
accountDataCollection.insertOne(accountDTO);
return accountDataCollection.find();
}
}
和getDbCollection
:
public static MongoCollection<AccountDTO> getDbCollection() {
MongoDatabase db = Utils.getDbConnect();
MongoCollection<AccountDTO> accountDataCollection = null ;
accountDataCollection = db.getCollection(AccountDTO.COLLECTION_NAME,AccountDTO.class);
return accountDataCollection;
}
CodecImplementationProvider:
package utils;
import org.bson.BsonReader;
import org.bson.BsonWriter;
import org.bson.codecs.Codec;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;
import org.bson.codecs.configuration.CodecRegistry;
import digester.Account;
import digester.Customer;
import dto.AccountDTO;
// the Codec extends two interfaces: Encoder<T>, Decoder<T>
class MyAccountDTOImpCodec implements Codec<AccountDTO> {
private CodecRegistry codecRegistry;
public MyAccountDTOImpCodec(CodecRegistry codecRegistry) {
this.codecRegistry = codecRegistry;
}
public void encode(BsonWriter writer, AccountDTO doc, EncoderContext encoderContext) {
writer.writeStartDocument();
writer.writeName("IBAN");
writer.writeString(doc.getIBAN());
writer.writeName("customerFirstName");
writer.writeString(doc.getCustomerFirstName());
writer.writeName("customerLastName");
writer.writeString(doc.getCustomerLastName());
writer.writeEndDocument();
}
public Class<AccountDTO> getEncoderClass() {
return AccountDTO.class;
}
public AccountDTO decode(BsonReader reader, DecoderContext decoderContext) {
reader.readStartDocument();
String iBAN = reader.readString("IBAN");
String firstName = reader.readString("customerFirstName");
String lastName = reader.readString("customerLastName");
double balance = reader.readDouble("balance");
String currency = reader.readString("currency");
long customerId = reader.readInt64("customerId");
reader.readEndDocument();
Account account = new Account(iBAN, balance, currency);
Customer customer = new Customer(firstName, lastName, customerId, account);
AccountDTO doc = new AccountDTO(account, customer);
return doc;
}
}
编解码器提供者:
package utils;
import org.bson.codecs.Codec;
import org.bson.codecs.configuration.CodecProvider;
import org.bson.codecs.configuration.CodecRegistry;
import dto.AccountDTO;
class MyCodecProvider implements CodecProvider {
public <T> Codec<T> get(Class<T> myClass, CodecRegistry codecRegistry) {
if (myClass== AccountDTO.class) {
return (Codec<T>) new MyAccountDTOImpCodec(codecRegistry);
}
return null;
}
}
当使用 JUnit
运行测试时,我得到了这个堆栈:
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class dto.AccountDTO.
我认为这是一个糟糕的实现,在 Node.js
中我会发送我的 json
对象,发送 java
对象似乎很奇怪到 MongoDB
。
这只是对 javadoc
的错误解释还是我的代码中的某种缺失?
最佳答案
您必须为 Java 类实现一个编解码器,然后 MongoDB 将能够将 BSON 值解码为 Java 对象,并将 Java 对象编码为 BSON 值。看看这个 Mongo Java 驱动程序文档:http://mongodb.github.io/mongo-java-driver/3.0/bson/codecs/
这将是代表 MongoDB 集合中文档的 POJO 类:
class MyDocument {
private String id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "MyDocument [id=" + id + ", name=" + name + "]";
}
}
我们需要创建一个实现编解码器接口(interface)的类,此外它还扩展了接口(interface):Encoder<T>
和Decoder<T>
。此类将提供将 MyDocument Java 对象编码和解码为 BSON 文档所需的方法。
class MyDocumentImpCodec implements Codec<MyDocument> {
private CodecRegistry codecRegistry;
public MyDocumentImpCodec(CodecRegistry codecRegistry) {
this.codecRegistry = codecRegistry;
}
public void encode(BsonWriter writer, MyDocument doc, EncoderContext encoderContext) {
writer.writeStartDocument();
writer.writeName("_id");
writer.writeString(doc.getId());
writer.writeName("name");
writer.writeString(doc.getName());
writer.writeEndDocument();
}
public MyDocument decode(BsonReader reader, DecoderContext decoderContext) {
reader.readStartDocument();
String id = reader.readString("_id");
String name = reader.readString("name");
reader.readEndDocument();
MyDocument doc = new MyDocument();
doc.setId(id);
doc.setName(name);
return doc;
}
public Class<MyDocument> getEncoderClass() {
return MyDocument.class;
}
}
CodecProvider 是 Codec 实例的工厂。
class MyCodecProvider implements CodecProvider {
public <T> Codec<T> get(Class<T> myClass, CodecRegistry codecRegistry) {
if (myClass == MyDocument.class) {
return (Codec<T>) new MyDocumentImpCodec(codecRegistry);
}
return null;
}
}
CodecRegistry 类包含一组 Codec 实例,这些实例根据它们编码和解码的 Java 类进行访问。在我们的示例中,CodecRegistry 实例仅获取我们之前定义的 MyCodecProvider 和 default codec registries 。
public static MongoCollection<AccountDTO> getDbCollection() {
// ...................................................
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(
CodecRegistries.fromProviders(new MyCodecProvider()),
MongoClient.getDefaultCodecRegistry());
MongoClientOptions options = MongoClientOptions
.builder()
.codecRegistry(codecRegistry)
.build();
// ...................................................
MongoClient mongoClient = new MongoClient(MONGODB_SERVER_IP, options);
MongoDatabase = db = mongoClient.getDatabase(MONGODB_SERVER_DATABASE_NAME);
MongoCollection<MyDocument> collection = db.getCollection(
MONGODB_SERVER_COLLECTION_NAME,
MyDocument.class);
return collection;
}
DAO方法实现示例:
public static void getDocument() {
FindIterable<MyDocument> iterator = collection.find();
for (MyDocument doc : iterator) {
System.out.println(doc);
}
}
public static void insertDocument() {
MyDocument doc = new MyDocument();
doc.setId("1001");
doc.setName("myName");
collection.insertOne(doc);
}
关于java - 具有特定文档类的 MongoDB getCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36521817/
这是代码片段。 请说出这种用小内存存储大数据的算法是什么。 public static void main(String[] args) { long longValue = 21474836
所以我使用 imap 从 gmail 和 outlook 接收电子邮件。 Gmail 像这样编码 =?UTF-8?B?UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpb
很久以前就学会了 C 代码;想用 Scheme 尝试一些新的和不同的东西。我正在尝试制作一个接受两个参数并返回两者中较大者的过程,例如 (define (larger x y) (if (> x
Azure 恢复服务保管库有两个备份配置选项 - LRS 与 GRS 这是一个有关 Azure 恢复服务保管库的问题。 当其驻留区域发生故障时,如何处理启用异地冗余的恢复服务保管库?如果未为恢复服务启
说,我有以下实体: @Entity public class A { @Id @GeneratedValue private Long id; @Embedded private
我有下一个问题。 我有下一个标准: criteria.add(Restrictions.in("entity.otherEntity", getOtherEntitiesList())); 如果我的
如果这是任何类型的重复,我会提前申请,但我找不到任何可以解决我的具体问题的内容。 这是我的程序: import java.util.Random; public class CarnivalGame{
我目前正在使用golang创建一个聚合管道,在其中使用“$ or”运算符查询文档。 结果是一堆需要分组的未分组文档,这样我就可以进入下一阶段,找到两个数据集之间的交集。 然后将其用于在单独的集合中进行
是否可以在正则表达式中创建 OR 条件。 我正在尝试查找包含此类模式的文件名列表的匹配项 第一个案例 xxxxx-hello.file 或者案例二 xxxx-hello-unasigned.file
该程序只是在用户输入行数时创建菱形的形状,因此它有 6 个 for 循环; 3 个循环创建第一个三角形,3 个循环创建另一个三角形,通过这 2 个三角形和 6 个循环,我们得到了一个菱形,这是整个程序
我有一个像这样的查询字符串 www.google.com?Department=Education & Finance&Department=Health 我有这些 li 标签,它们的查询字符串是这样
我有一个带有静态构造函数的类,我用它来读取 app.config 值。如何使用不同的配置值对类进行单元测试。我正在考虑在不同的应用程序域中运行每个测试,这样我就可以为每个测试执行静态构造函数 - 但我
我正在寻找一个可以容纳多个键的容器,如果我为其中一个键值输入保留值(例如 0),它会被视为“或”搜索。 map, int > myContainer; myContainer.insert(make_
我正在为 Web 应用程序创建数据库,并正在寻找一些建议来对可能具有多种类型的单个实体进行建模,每种类型具有不同的属性。 作为示例,假设我想为“数据源”对象创建一个关系模型。所有数据源都会有一些共享属
(1) =>CREATE TABLE T1(id BIGSERIAL PRIMARY KEY, name TEXT); CREATE TABLE (2) =>INSERT INTO T1 (name)
我不确定在使用别名时如何解决不明确的列引用。 假设有两个表,a 和 b,它们都有一个 name 列。如果我加入这两个表并为结果添加别名,我不知道如何为这两个表引用 name 列。我已经尝试了一些变体,
我的查询是: select * from table where id IN (1,5,4,3,2) 我想要的与这个顺序完全相同,不是从1...5,而是从1,5,4,3,2。我怎样才能做到这一点? 最
我正在使用 C# 代码执行动态生成的 MySQL 查询。抛出异常: CREATE TABLE dump ("@employee_OID" VARCHAR(50)); "{"You have an er
我有日期 2016-03-30T23:59:59.000000+0000。我可以知道它的格式是什么吗?因为如果我使用 yyyy-MM-dd'T'HH:mm:ss.SSS,它会抛出异常 最佳答案 Sim
我有一个示例模式,它的 SQL Fiddle 如下: http://sqlfiddle.com/#!2/6816b/2 这个 fiddle 只是根据 where 子句中的条件查询示例数据库,如下所示:
我是一名优秀的程序员,十分优秀!