鉴于此文档保存在MongoDB中
{
_id : ...,
some_key: {
param1 : "val1",
param2 : "val2",
param3 : "val3"
}
}
Run Code Online (Sandbox Code Playgroud)
对新信息的对象param2,并param3从外面的世界需要保存
var new_info = {
param2 : "val2_new",
param3 : "val3_new"
};
Run Code Online (Sandbox Code Playgroud)
我想在对象的现有状态上合并/覆盖新字段,以便不会删除param1
这样做
db.collection.update( { _id:...} , { $set: { some_key : new_info } }
Run Code Online (Sandbox Code Playgroud)
将导致MongoDB完全按照要求执行,并将some_key设置为该值.取代旧的.
{
_id : ...,
some_key: {
param2 : "val2_new",
param3 : "val3_new"
}
}
Run Code Online (Sandbox Code Playgroud)
MongoDB只更新新字段的方法是什么(没有明确说明它们)?得到这个:
{
_id : ...,
some_key: {
param1 : "val1",
param2 : "val2_new",
param3 : "val3_new"
} …Run Code Online (Sandbox Code Playgroud) 我想从mongodb获得一个排序形式的名称.我通过以下方式完成了这个
__PRE__
通过此查询执行,我能够找到区分大小写的排序结果.但我只想在忽略形式的情况下获得结果.怎么做?请指导我完成这个.
我正在研究java代码.所以请用适当的方法建议我.
如何将MongoDB命令的结果导出到平面文件
例如,如果我要db.collectionname.find()进入平面文件.
我试过db.collectionname.find() >> "test.txt"似乎没有工作.
我看到一个奇怪的问题使用 casbah / java driver.
当驱动程序尝试从mongo创建响应时,我一直遇到以下异常:
Oct 16, 2012 10:45:07 AM com.mongodb.DBTCPConnector$MyPort error
SEVERE: MyPort.error called
java.lang.IllegalArgumentException: response too long: 1634610484
at com.mongodb.Response.(Response.java:40)
at com.mongodb.DBPort.go(DBPort.java:110)
at com.mongodb.DBPort.go(DBPort.java:75)
at com.mongodb.DBPort.call(DBPort.java:65)
at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:201)
at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:295)
at com.mongodb.DBCursor._check(DBCursor.java:354)
at com.mongodb.DBCursor._hasNext(DBCursor.java:484)
at com.mongodb.DBCursor.hasNext(DBCursor.java:509)
at com.mongodb.casbah.MongoCursorBase$class.hasNext(MongoCursor.scala:73)
at com.mongodb.casbah.MongoCursor.hasNext(MongoCursor.scala:497)
at scala.collection.Iterator$class.foreach(Iterator.scala:660)
at com.mongodb.casbah.MongoCursor.foreach(MongoCursor.scala:497)
...
Run Code Online (Sandbox Code Playgroud)
这似乎是随机发生的,即使在mongo不应该从查询中返回任何结果的情况下也是如此.报告的大小不一致,通常大于应有或可能的大小.
我猜这可能是某种形式的腐败与回应.我使用Wireshark很难解决这个问题的正面或反面,但我一直发现导致响应抛出此错误的查询的请求/响应链具有来自MongoDB的"TCP Window Full"响应:

我正在使用的版本:
Casbah: 2.1.5.0
Mongo Java Driver: 2.5.3
MongoDB: 2.2
如果有人能就我可能做错的事情或任何有关如何进一步调试此问题的指示提出任何建议,我将不胜感激.
更新:查看发行说明后,Casbah 2.1.5.0,似乎使用的java驱动程序的版本是2.5.3,而不是2.7.3
使用MongoDB createIndex()和ensureIndex()Java 之间有什么区别?我用Google搜索了这个,但没有得到满意的答案.
我试图通过搜索"_id"键在MongoDB中查找文档.我的文件看起来像这样 -
{
"_id" : ObjectId("4f693d40e4b04cde19f17205"),
"hostname" : "hostnameGoesHere",
"OSType" : "OSTypeGoesHere"
}
Run Code Online (Sandbox Code Playgroud)
我试图搜索这份文件 -
ObjectId id= new ObjectId("4f693d40e4b04cde19f17205");
BasicDBObject obj = new BasicDBObject();
obj.append("_id", id);
BasicDBObject query = new BasicDBObject();
query.putAll(query);
Run Code Online (Sandbox Code Playgroud)
但我得到以下错误 -
error: reference to putAll is ambiguous, both method putAll(Map) in BasicBSONObject and method putAll(BSONObject) in BasicBSONObject match
query.putAll(query);
Run Code Online (Sandbox Code Playgroud)
BasicDBObject的append方法支持(String Key,Value),如果我将"_id"作为String传递给此方法,则不匹配任何文档.
所以我的问题是如何通过"_id"?
我使用spring数据mongodb.
我想要两个日期之间的记录.以下MongoDB查询有效:
db.posts.find({startDate: {$gte: start, $lt: end}});
Run Code Online (Sandbox Code Playgroud)
我尝试过的Spring数据查询对象代码转换不起作用:
Query query = new Query();
query.addCriteria(Criteria.where("startDate").gte(startDate)
.and("startDate").lt(endDate));
Run Code Online (Sandbox Code Playgroud)
构建我需要的Mongo查询的方法调用的正确顺序是什么?
我在我的应用程序中使用MongoDB,需要在MongoDB集合中插入多个文档.我使用的版本是1.6
我在这里看到了一个例子
http://docs.mongodb.org/manual/core/create/
在里面
批量插入多个文档 部分
作者传递数组的地方.
当我尝试相同的,但为什么它不允许,请告诉我如何一次插入多个文件?
package com;
import java.util.Date;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.MongoClient;
public class App {
public static void main(String[] args) {
try {
MongoClient mongo = new MongoClient("localhost", 27017);
DB db = mongo.getDB("at");
DBCollection collection = db.getCollection("people");
/*
* BasicDBObject document = new BasicDBObject();
* document.put("name", "mkyong"); document.put("age", 30);
* document.put("createdDate", new Date()); table.insert(document);
*/
String[] myStringArray = new String[] { "a", "b", "c" };
collection.insert(myStringArray); // Compilation error at this …Run Code Online (Sandbox Code Playgroud) 我是mongodb的新手.我可以知道如何避免重复输入.在关系表中,我们使用主键来避免它.我可以知道如何使用java在Mongodb中指定它吗?
我在mongodb用户列表上问了同样的问题:http://groups.google.com/group/mongodb-user/browse_thread/thread/b3470d6a867cd24
我希望这个论坛上有人可能会有一些见解......
我运行了一个简单的实验来比较使用python和java的游标迭代的性能,并发现python实现速度慢了大约10倍.我希望有人可以告诉我这是否有预期的差异,或者我是否在python方面做了一些明显低效的事情.
基准测试很简单:它执行查询,迭代光标,并检查每个文档中的相同字段.在python版本中,我可以每秒检查大约22k个文档.在java版本中,我可以每秒检查大约220k文档.
我已经看到了一些关于python性能的类似问题,我已经接受了建议,并确保我使用的是C扩展:
>>> import pymongo
>>> pymongo.has_c()
True
>>> import bson
>>> bson.has_c()
True
Run Code Online (Sandbox Code Playgroud)
最后,我不认为差异是由于python和java之间的根本区别,至少在我的测试代码级别.例如,如果我将查询的文档存储在python列表中,我可以非常快速地遍历该列表.换句话说,它不是一个低效的python for循环来解释差异.此外,在插入文档时,我获得了与Java相比几乎相同的性能.
以下是有关查询的更多详细信息:
mongodb-java ×10
mongodb ×9
java ×6
bulkinsert ×1
casbah ×1
pymongo ×1
sorting ×1
spring ×1
spring-data ×1