我想用log4j在Sfl4j上记录Morphia。从Morphia的文档中:
在您的应用程序开始时添加它。静态完成一次。MorphiaLoggerFactory.registerLogger(SLF4JLoggerImplFactory.class);
我无法为上述声明创建必要的bean来完成该工作。
我有一个Servlet与static Mongo = new Mongo()和Morphia morphia = new Morphia()对象.每次GET调用时,我都会执行以下操作:
doGet(...){
...
datastore = morphia.createDatastore(mongo, dbName);
...
}
Run Code Online (Sandbox Code Playgroud)
我没有关闭datastore,因为没有密切的方法.每次调用servlet时,mongo中使用的连接数增加:
{ "current" : 113, "available" : 706, "totalCreated" : NumberLong(122) }
> db.serverStatus().connections { "current" : 115, "available" : 704, "totalCreated" : NumberLong(124) }
> db.serverStatus().connections { "current" : 116, "available" : 703, "totalCreated" : NumberLong(125) }
> db.serverStatus().connections { "current" : 121, "available" : 698, "totalCreated" : NumberLong(130) }
> db.serverStatus().connections …Run Code Online (Sandbox Code Playgroud) 假设我在mongo中有一些这样的json:
{"n":"5"}
Run Code Online (Sandbox Code Playgroud)
和这样的java类:
@Entity
public class Example {
Integer n;
}
Run Code Online (Sandbox Code Playgroud)
这工作(我知道json应该将值存储为int而不是字符串,但我不控制该部分).
现在,当我有像这样的数据时,morphia抛出:
{"n":""}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种解决方法(我喜欢的行为是将空字符串视为null).
到目前为止我唯一的解决方法是:
public class Example {
String n;
public Integer getN() {
return NumberUtils.isNumber(n) ? NumberUtils.createInteger(n) : null;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我希望能够在Integer属性上挂起注释来自定义反序列化行为.
如果我收集了以下要素,
@Entity
public void MyEntity{
public String name;
public String type;
...
}
Run Code Online (Sandbox Code Playgroud)
我想返回的不是元素List<String>(或Set),而是它们的name字段。
List<String> allNames = datasotre.find(MyEntity.class).asList("name");
Run Code Online (Sandbox Code Playgroud)
这是示例查询,没有这样的Morphia数据存储方法。
我有一个使用Morphia映射的ObjectId列表.在java中,映射看起来像这样:
public class Log {
@Indexed
public List<ObjectId> companyIds;
....
}
Run Code Online (Sandbox Code Playgroud)
但是,在Mongo shell中,当我使用$ elemMatch进行搜索时,它会抱怨无效类型.
> db.Log.find({ "companyIds" : { "$elemMatch" : ObjectId("5059e90d0364d02be740417a")}})
error: {
"$err" : "invalid parameter: expected an object ($elemMatch)",
"code" : 10065
}
Run Code Online (Sandbox Code Playgroud)
在使用带有ObjectId的$ elemMatch时,还有什么需要做的吗?
谢谢
我刚刚开始使用 MongoDB(我的第一次 NoSQL 数据库体验)。这是一个未来将处理大量数据的项目。我正在编写数据访问的框架。经过很多思考,我仍然很困惑是应该为 MongoDB 选择像 morphia 这样的 ORM,还是应该使用 MongoDB 驱动程序类提供的接口并从头开始编写 DAO。我知道这里在性能和易于开发之间存在权衡。同时,与关系数据库不同,我猜在大多数情况下,NoSQL 数据库不一定需要 ORM 映射器。请建议我将 ORM for MongoDB 用于大数据初创公司?
长话短说:是否可以使用Morphia为第三方库类编写类型转换器?
长话:我是Morphia的新手.我有一个实体类,其中包含一个字段类型为javax.activation.MimeType.当我尝试保存我的类的实例时,Morphia抱怨它"无法序列化类javax.activation.MimeType".我尝试编写TypeConverter并将其添加到转换器列表中但它不起作用.以下是代码段:
@Entity
@Converters(MimeTypeConverter.class)
public class Entity {
@Id ObjectId id;
String name;
javax.activation.MimeType mimeType;
}
Run Code Online (Sandbox Code Playgroud)
public class MimeTypeConverter extends TypeConverter {
@Override
public Object decode(Class targetClass,
Object fromDBObject,
MappedField optionalExtraInfo) {
MimeType mimetype;
BasicDBObject dbObject = (BasicDBObject) fromDBObject;
String mimeString = dbObject.getString("mimeType");
try{
mimetype = new MimeType(mimeString);
} catch(MimeTypeParseException ex){
mimetype = new MimeType();
}
return mimetype;
}
@Override
public Object encode(Object value, MappedField optionalExtraInfo) {
MimeType mimetype = (MimeType) value;
return mimetype.getBaseType();
}
@Override …Run Code Online (Sandbox Code Playgroud) 我在执行吗啡查询时遇到问题。我有一个这样的架构:
{ authorId:12345,
comments:[
{ userId:34567,
name:"joe" },
{ userId:98765,
name:"sam" }
]
}
Run Code Online (Sandbox Code Playgroud)
我想使用吗啡查找所有记录,其中searchId 等于authorId 或userId。
我尝试了一系列的事情,但我没有得到它。例如
Query<Record> query = datastore.find(Record.class);
query.or(
query.criteria(authorId).equal(searchId),
query.criteria(comments).hasAnyOf(Collections.singletonList(searchId))
);
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用 hasThisElement,但这也不起作用。
我该怎么做呢?
我在 Morphia 中创建聚合时遇到问题,文档确实不清楚。这是原始查询:
db.collection('events').aggregate([
{
$match: {
"identifier": {
$in: [
userId1, userId2
]
},
$or: [
{
"info.name": "messageType",
"info.value": "Push",
"timestamp": {
$gte: newDate("2015-04-27T19:53:13.912Z"),
$lte: newDate("2015-08-27T19:53:13.912Z")
}
}
]
}{
$unwind: "$info"
},
{
$match: {
$or: [
{
"info.name": "messageType",
"info.value": "Push"
}
]
}
]);
Run Code Online (Sandbox Code Playgroud)
他们的文档中唯一的例子是使用了,这里有一些例子,但我无法让它工作。
我什至没有通过第一场比赛,这是我所拥有的:
ArrayList<String> ids = new ArrayList<>();
ids.add("199941");
ids.add("199951");
Query<Event> q = ads.getQueryFactory().createQuery(ads);
q.and(q.criteria("identifier").in(ids));
AggregationPipeline pipeline = ads.createAggregation(Event.class).match(q);
Iterator<Event> iterator = pipeline.aggregate(Event.class);
Run Code Online (Sandbox Code Playgroud)
一些帮助或指导以及如何开始查询或它是如何工作的会很棒。
我正在尝试对包含公告板数据的集合使用范围查询来获取项目的排序列表。一个“线程”文档的数据结构是:
{
"_id" : ObjectId("5a779b47f4fa72412126526a"),
"title" : "necessitatibus tincidunt libris assueverit",
"content" : "Corrumpitvenenatis cubilia adipiscing sollicitudin",
"flagged" : false,
"locked" : false,
"sticky" : false,
"lastPostAt" : ISODate("2018-02-05T06:35:24.656Z"),
"postCount" : 42,
"user" : ObjectId("5a779b46f4fa72412126525a"),
"category" : ObjectId("5a779b31f4fa724121265164"),
"createdAt" : ISODate("2018-02-04T23:46:15.852Z"),
"updatedAt" : ISODate("2018-02-05T06:35:24.656Z")
}
Run Code Online (Sandbox Code Playgroud)
查询是:
db.threads.find({
category: ObjectId('5a779b31f4fa724121265142'),
_id : { $gt: ObjectId('5a779b5cf4fa724121269be8') }
}).sort({ sticky: -1, lastPostAt: -1, _id: 1 }).limit(25)
Run Code Online (Sandbox Code Playgroud)
我设置了以下索引来支持它:
{ category: 1, _id: 1 }
{ category: 1, _id: 1, sticky: 1, lastPostAt: 1 } …Run Code Online (Sandbox Code Playgroud)