标签: mongo-java

(MongoDB Java)$ push into array

我正在使用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)

java mongodb nosql-aggregation mongo-java jongo

34
推荐指数
4
解决办法
3万
查看次数

同一个MongoDB更新中的$ push和$ set

我正在尝试使用MongoDB的Java驱动程序在同一操作中对记录进行两次更新($ set和$ push).我使用的代码类似于以下内容:

    BasicDBObject pushUpdate = new BasicDBObject().append("$push", new BasicDBObject().append("values", dboVital));
    BasicDBObject setUpdate = new BasicDBObject().append("$set", new BasicDBObject().append("endTime", time));
    BasicDBList combinedUpdate = new BasicDBList();
    combinedUpdate.add( pushUpdate);        
    combinedUpdate.add( setUpdate);


    collection.update( new BasicDBObject().append("_id", pageId), combinedUpdate, true, false);
Run Code Online (Sandbox Code Playgroud)

当我通过BasicDBList将$ set和$ push组合到同一个更新中时,我得到一个IllegalArgumentException:"存储在db中的字段不能以'$'开头(Bad Key:'$ push')".

如果我进行两次单独的更新,则pushUpdate和setUpdate都会生成有效结果.

谢谢!

java mongodb mongo-java

28
推荐指数
1
解决办法
2万
查看次数

如何在不同的时区按年 - 月 - 日汇总

我有一个MongoDB,它以UTC格式存储日期对象.好吧,我想在不同的时区(CET)按年,月份进行汇总.

这样做,适用于UTC:

    BasicDBObject group_id = new BasicDBObject("_id", new BasicDBObject("year", new BasicDBObject("$year", "$tDate")).
                append("month", new BasicDBObject("$month", "$tDate")).
                append("day", new BasicDBObject("$dayOfMonth", "$tDate")).
                append("customer", "$customer"));

    BasicDBObject groupFields = group_id.
            append("eventCnt", new BasicDBObject("$sum", "$eventCnt")); 

    BasicDBObject group = new BasicDBObject("$group", groupFields);
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用命令行(未测试,我只测试了java版本):

{
    $group: {
        _id: {
            "year": {
                "$year", "$tDate"
            },
            "month": {
                "$month", "$tDate"
            },
            "day": {
                "$dayOfMonth", "$tDate"
            },
            "customer": "$customer"
        },
        "eventCount": {
            "$sum": "$eventCount"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在聚合框架内将这些日期转换为CET?

例如'2013-09-16 23:45:00 UTC'是'2013-09-17 00:45:00 CET',这是另一天.

mongodb mongo-java

23
推荐指数
3
解决办法
1万
查看次数

MongoDB Java API慢速阅读性能

我们正在从本地MongoDB中读取所有来自集合的文档,并且性能不是很高兴.

我们需要转储所有数据,不要担心为什么,只是相信它真的需要并且没有可能的解决方法.

我们有4mio文件看起来像:

{
    "_id":"4d094f58c96767d7a0099d49",
    "exchange":"NASDAQ",
    "stock_symbol":"AACC",
    "date":"2008-03-07",
    "open":8.4,
    "high":8.75,
    "low":8.08,
    "close":8.55,
    "volume":275800,
    "adj close":8.55
}
Run Code Online (Sandbox Code Playgroud)

我们现在使用这个简单的代码来阅读:

MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("localhost");
MongoCollection<Document> collection = database.getCollection("test");

MutableInt count = new MutableInt();
long start = System.currentTimeMillis();
collection.find().forEach((Block<Document>) document -> count.increment() /* actually something more complicated */ );
long start = System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)

我们正在以16秒(250k行/秒)的速度阅读整个系列,这对于小型文档来说真的不是很令人印象深刻.请记住,我们要加载800十亿行.没有聚合,地图缩小或类似是可能的.

这是否与MongoDB一样快或者是否有其他方法可以更快地加载文档(其他技术,移动Linux,更多RAM,设置......)?

java performance mongodb mongodb-java mongo-java

23
推荐指数
2
解决办法
1964
查看次数

通过Java执行像Query(JSON)这样的Mongo

我想知道是否有一种方法可以直接通过Java执行类似查询的mongo,即我们将mongoDB查询作为字符串提供给Java驱动程序中的函数,用于mongoDB作为String对象并返回DBCursor对象.就像是:

import com.mongodb.*;
import java.net.UnknownHostException;
public class ExecuteQuery {
public static void main(String args[]){
    try{
          Mongo m = new Mongo();
          DB db = m.getDB("test");
          DBCollection coll = db.getCollection("first");
          DBObject doc = new BasicDBObject();
          DBCursor cur =coll.executeQuery("db.first.find({"username":"joe"})");
       }
       catch(UnknownHostException e){
          System.out.println(e);
       }
       catch (MongoException.DuplicateKey e) {
          System.out.println("Exception Caught" + e);
       }
}
}
Run Code Online (Sandbox Code Playgroud)

注意:executeQuery()不是内置函数.它仅用于演示目的.那么,java api中是否有一个将json字符串转换为BasicDBObject实例的函数?谢谢.

java json mongodb mongo-java

19
推荐指数
2
解决办法
3万
查看次数

如何使用java驱动程序更新mongo db中的文档字段?

参考文献:

仍然是mongo db的新手,但我正在尝试更新集合中现有文档的一部分......遗憾的是,上面的链接没有更新示例.

基本上,我只是希望能够:

  1. 向文档添加新字段
  2. 将文档的现有字段更新为新值

这是我的代码(Grails + Groovy + Java + MongoDB + java驱动程序):

def shape = mongo.shapes.findOne(new BasicDBObject("data", "http://www.foo.com")); // get the document
mongo.shapes.update(new BasicDBObject("_id", shape._id), new BasicDBObject("isProcessed", 0));  // add a new "isProcessed" field set to 0
mongo.shapes.update(new BasicDBObject("_id", shape._id), new BasicDBObject("data", "http://www.bar.com"));
Run Code Online (Sandbox Code Playgroud)

这几乎破坏了整个对象...我可能只是尝试修改原始形状对象,然后在其上运行更新.但在那之前,是否有人有更新单个字段(而不是整个文档)的经验?

编辑:

我只是尝试了它,并且能够通过发送整个对象以及新的和/或更新的字段来成功更新.我想知道驱动程序是否足够聪明,只更新最小的更改子集,或者只是盲目更新整个事物?(在下面的例子中,它只是更新电线或整个形状文档的foo字段?)

码:

def shape = mongo.shapes.findOne(); // get the first shape to use as a base
shape.removeField("_id");  // remove the id field
shape.put("foo","bar");  // add a new field "foo"
mongo.shapes.insert(shape); …
Run Code Online (Sandbox Code Playgroud)

java grails groovy mongodb mongo-java

18
推荐指数
3
解决办法
5万
查看次数

如何从驱动程序检查mongoDB服务器是否正在运行

我想知道,如果有办法检查mongoDB服务器是否从mongoDB的java驱动程序运行?

根据教程,我可以做到

Mongo m = new Mongo();
// or
Mongo m = new Mongo( "localhost" , 27017 );
// and
DB db = m.getDB( "mydb" );
Run Code Online (Sandbox Code Playgroud)

但是如何检查我可以使用这些Mongo和DB?我在API中看不到isConnected()方法.

db.getConnector().isOpen() 
Run Code Online (Sandbox Code Playgroud)

返回true

我找到的唯一方法是调用db.getDatabaseNames()并捕获MongoException.

如果有一些更文明的方法?

java mongodb mongo-java

16
推荐指数
3
解决办法
2万
查看次数

MongoDB中cursor.count()和cursor.size()之间的区别

MongoDB的方法cursor.count()cursor.size()方法有什么区别DBCursor

java mongodb mongodb-java mongo-java

16
推荐指数
1
解决办法
9687
查看次数

带有限制和排序的java中的mongodb问题

收藏:progs的

{ "_id" : "ABC", "defaultDirectory" : "abc", "defaultRecvDirectory" : "abc" }
{ "_id" : "RAS", "defaultRecvDirectory" : "recv/ras" }
{ "_id" : "SND", "defaultSendDirectory" : "send/snd" }
Run Code Online (Sandbox Code Playgroud)

在mongo控制台中:

db.progs.find({"_id":{"$lt":"ZZZZZZZZZ"}}).sort({"_id":-1}).limit(1);

==>    { "_id" : "SND", "defaultSendDirectory" : "send/snd" }
Run Code Online (Sandbox Code Playgroud)

在Java中:

    BasicDBObject query = new BasicDBObject();
    query.put("_id", new BasicDBObject("$lt", "ZZZZZZZZZZ"));
    DBCursor cursor = collection.find(query).sort(new BasicDBObject("_id","-1")).limit(1);
    for (DBObject dbObject : cursor) {
        System.out.println(dbObject);
    }

==>    { "_id" : "ABC", "defaultSendDirectory" : "abc", "defaultRecvDirectory" : "abc" }
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这个区别吗?

mongodb mongo-java

14
推荐指数
2
解决办法
3万
查看次数

Mongo打开了太多连接

我试图在Java循环中向MongoDB写入大量数据.我根据打开的连接数得到错误.

我的理论是,由于MongoDB不是事务性的,因此可以同时打开许多连接.然而,Java代码也能够非常快地循环,在一段时间之后,循环迭代的次数开始超过可用连接的数量并且Mongo碰到墙.

我的代码看起来像这样.我已经看到它建议不要这样做m.close()但是你只是更快地得到错误.

public static void upsert(){
    Mongo m = null;
    DB db = null;

    try {
    m = new Mongo("localhost");
    db = m.getDB("sempedia");    } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (MongoException e1) { e1.printStackTrace(); }

    // create documents
    // I am doing an upsert - hence the doc, doc
    DBCollection triples;
try {
        triples = db.getCollection("triples");
        triples.update(doc,doc,true,false); 
    } catch (MongoException e) { e.printStackTrace(); }

    m.close();
}
Run Code Online (Sandbox Code Playgroud)

在我的java控制台中,我收到此错误:

警告:使用0 java.net.SocketException确定maxBSON大小的异常:连接重置

并且mongodb给出了这个错误:

星期二十月二十五日22:31:39 [initandlisten]连接被拒绝,因为太多的开放连接:204中的204

处理这个问题最优雅的方法是什么?

java connection mongodb mongo-java

13
推荐指数
1
解决办法
2万
查看次数