我正在使用mongo 2.2.3和java驱动程序.我的困境,我必须把一个字段和值推入一个数组,但我似乎无法弄清楚如何做到这一点.我的数据样本:
"_id" : 1,
"scores" : [
{
"type" : "homework",
"score" : 78.97979
},
{
"type" : "homework",
"score" : 6.99
},
{
"type" : "quiz",
"score" : 99
}
]
Run Code Online (Sandbox Code Playgroud)
我可以$推入shell:
db.collection.update({_id:1},{$push:{scores:{type:"quiz", score:99}}})
Run Code Online (Sandbox Code Playgroud)
但是当我把它翻译成java时,我迷惑自己并将键盘放在墙上.
到目前为止我的java代码(不完整和错误):
DBObject find = new BasicDBObject("_id", 1);
DBObject push = new BasicDBObject("$push", new BasicDBObject(
"scores", new BasicDBObject()));
Run Code Online (Sandbox Code Playgroud) 我试图找出Jongo的优势而不是简单地使用(DBObject)JSON.parse(...)解组json命令并以下面的方式使用DBObject.
有性能优势吗?
@Override
public List<T> getEntityList(Integer limit, String query) throws Exception {
log.entering(DaoImpl.class.toString(), "getEntityList, with criteria of " + query);
DBObject criteriaObject = null;
ArrayList<T> list = new ArrayList<T>();
if (query != null)
criteriaObject = (DBObject)JSON.parse(query);
DBCursor cursor = null;
try {
if (criteriaObject != null) {
log.log(Level.FINEST, "getting the objects using a search criteria: " + criteriaObject);
cursor = MongoDB.getInstance().getCollection(collection).find(criteriaObject);
} else {
log.log(Level.FINEST, "getting the objects without a criteria");
cursor = MongoDB.getInstance().getCollection(collection).find();
}
............etc, etc, etc
Run Code Online (Sandbox Code Playgroud)
谢谢!
我刚刚开始使用 play 框架、jongo 和 MongoDB 开发一个项目。该项目最初是在 Play 2.1 中使用 pojo 编写的,其 String id 字段同时注释有: @Id 和 @ObjectId 这将作为 ObjectId 持久保存到 Mongo,并且反序列化时会将 id 输出为: "id":"53fcb9ede4b0b18314098d10" 例如。
由于升级到 Jongo 1.1 和 Play 2.3.3,id 属性在反序列化时始终命名为“_id”,我希望该属性保留字段名称,但无法使用 @JsonProperty("custom_name") 作为 Jongo @Id 注释@JsonProperty("_id") 在幕后执行。
import org.jongo.marshall.jackson.oid.Id;
import org.jongo.marshall.jackson.oid.ObjectId;
public class PretendPojo {
@Id
@ObjectId
private String id;
private String name;
public PretendPojo() {
}
public PretendPojo(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = …Run Code Online (Sandbox Code Playgroud) 我使用jongo驱动程序连接到我的mongoDB.
查询的语法 - 例如,某些年龄小于18岁 - 是
collection.find("{age: {$lt : 18}}");
Run Code Online (Sandbox Code Playgroud)
但如何查询日期?
在mongoDB中,日期键值对存储如下
{"date" : ISODate("2012-11-23T00:12:23.123Z")}
Run Code Online (Sandbox Code Playgroud)
所以我尝试了以下内容:
collection.find("{date: {$lt : ISODate(\"2012-11-23T00:13:00.000Z\")}}");
Run Code Online (Sandbox Code Playgroud)
但是在运行java代码时我遇到了这个异常:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.IllegalArgumentException: {dateLastSeen: {$lt: ISODate("2012-11-23T00:13:00.000Z")}} cannot be parsed
at org.jongo.query.Query.convertToDBObject(Query.java:33)
at org.jongo.query.Query.<init>(Query.java:26)
at org.jongo.query.QueryFactory.createQuery(QueryFactory.java:38)
at org.jongo.Find.<init>(Find.java:42)
... 10 more
Caused by: com.mongodb.util.JSONParseException:
{dateLastSeen: {$lt: ISODate("2012-11-23T00:13:00.000Z")}}
^
at com.mongodb.util.JSONParser.parse(JSON.java:198)
at com.mongodb.util.JSONParser.parseObject(JSON.java:231)
at com.mongodb.util.JSONParser.parse(JSON.java:195)
at com.mongodb.util.JSONParser.parseObject(JSON.java:231)
at com.mongodb.util.JSONParser.parse(JSON.java:195)
at com.mongodb.util.JSONParser.parse(JSON.java:145)
at com.mongodb.util.JSON.parse(JSON.java:81)
at com.mongodb.util.JSON.parse(JSON.java:66) …Run Code Online (Sandbox Code Playgroud) 我知道这个问题非常基本......我很抱歉.
我不能使用Jongo为Mongo做一个'ID by ID'.
我试过了
Iterator<MongoTest> all = db.getCollection("mongoTest").find("{'_id': ObjectId('5194d46bdda2de09c656b64b')}").as(MongoTest.class).iterator();
Run Code Online (Sandbox Code Playgroud)
错误:
java.lang.IllegalArgumentException: {'_id': ObjectId('5194d46bdda2de09c656b64b')} cannot be parsed
at org.jongo.query.JsonQuery.marshallQuery(JsonQuery.java:34)
at org.jongo.query.JsonQuery.<init>(JsonQuery.java:27)
at org.jongo.query.JsonQueryFactory.createQuery(JsonQueryFactory.java:52)
at org.jongo.Find.<init>(Find.java:41)
at org.jongo.MongoCollection.find(MongoCollection.java:79)
at org.jongo.MongoCollection.find(MongoCollection.java:75)
Run Code Online (Sandbox Code Playgroud)
我试过了
Iterator<MongoTest> all = db.getCollection("mongoTest").find(withOid(new ObjectId("5194d46bdda2de09c656b64b"))).as(MongoTest.class).iterator();
Run Code Online (Sandbox Code Playgroud)
正如在文档中一样,我甚至无法编译它......有两种可能的ObjectId类型.
de.undercouch.bson4jackson.types.ObjectId;
Run Code Online (Sandbox Code Playgroud)
告诉我
The constructor ObjectId(String) is undefined
Run Code Online (Sandbox Code Playgroud)
如果我使用
org.bson.types.ObjectId;
Run Code Online (Sandbox Code Playgroud)
它似乎工作得更好,有时 - 但它仍然告诉我这withOid( ObjectId )是未定义的.这并不奇怪,究竟是什么对象应该是该函数的一部分呢?
我的问题:如何在Jongo中通过_id进行查找?
在mongodb中,我可以通过以下查询执行此操作:
find(
{ _id : { $in : [ ObjectId('5275c6721a88939923c3ea54'), ObjectId('5275c6721a88939923c3ea55'), ObjectId('5275c6721a88939923c3ea56'), ObjectId('5275c6721a88939923c3ea57'), ObjectId('5275c6721a88939923c3ea58') ] } }
)
Run Code Online (Sandbox Code Playgroud)
但是我们怎样才能使用Jongo代码呢?
我知道我们可以找到一个文件:
db.getCollection("mongoEg").findOne(Oid.withOid("5194d46bdda2de09c656b64b")).as(MongoTest.class);
Run Code Online (Sandbox Code Playgroud)
但如何通过Jongo在一个查询中获取多个文档?
Kotlin中的注释可以有不同的使用地点目标,如下所述:https://kotlinlang.org/docs/reference/annotations.html#annotation-use-site-targets
我的问题是:当没有明确定义use-site时,在类中注释属性时的默认目标是什么,如下例所示?
class Test {
@SomeAnnotation
var someProperty: String? = null
}
Run Code Online (Sandbox Code Playgroud)
背景
我正在尝试将Jongo作为Kotlin中的MongoDB客户端,并且在注释id字段时遇到问题.当它注释时,Jongo没有正确映射id属性:
@MongoId @MongoObjectId var id: String? = null
Run Code Online (Sandbox Code Playgroud)
有问题的注释只是杰克逊的元注释.但是,当我像这样注释属性时,它似乎工作,表明使用现场问题:
@field:[MongoId MongoObjectId]
var id: String? = null
Run Code Online (Sandbox Code Playgroud)
我希望这@field是默认的使用网站,但似乎不是.
我有一个有1000个记录的集合有一个字符串列.
我正在使用Jongo API来查询mongodb.
我需要找到匹配的记录,其中列字符串以字母"AB"开头,以斜杠"/"结尾
需要查询查询的帮助以选择相同的.
谢谢.
jongo ×8
mongodb ×7
java ×5
jackson ×2
annotations ×1
date ×1
kotlin ×1
mongo-java ×1
regex ×1