【发布时间】:2014-09-18 12:58:25
【问题描述】:
我有一个 mongo 文档,我试图在插入 mongodb 之前对其进行更新。
我必须把这 3 把钥匙放进去
document._parentId = ObjectId()
document.aDictionnary.actionId = Integer
document.aDictionnary.bDictionnary.id = Integer
我尝试了一些组合,但无法成功。
这是我当前的代码
myClass.getDocument().append( "$set", new BasicDBObject().append("_parentId", myClass.getDocument.getId() ) );
myClass.getDocument().append( "$set", new BasicDBObject().append("aDictionnary", new BasicDBObject().append("actionId", actionToAttachId ) ) );
if( null == myClass.getSiteId() )
{
myClass.getDocument().append( "$set", new BasicDBObject().append("aDictionnary", new BasicDBObject().append("bDictionnary", new BasicDBObject().append( "id", actionToAttach.getSiteId() ))));
}
我不想直接在数据库中更新我的文档,原因是我保留了所有历史记录,所以每个条目都是一个新插入。
应用程序不会崩溃,但由于“附加”语法错误而导致插入失败
另外,我认为由于嵌套的 basicdbobject.append 语法,编写这种代码令人不快,还有其他方法吗?
这是堆栈跟踪
163530 [http-8080-8] ERROR com.myapp.persistance.mystuff.MyClassMongo - java.lang.IllegalArgumentException: fields stored in the db can't start with '$' (Bad Key: '$set')
【问题讨论】:
-
你要做什么操作,
update或insert?完整的堆栈跟踪信息将有助于分析问题。 -
@Wizard 我刚刚更新了我的问题
-
报错信息很清楚,字段名不能以$开头,因为它是MongoDB中的元字符。
-
是的,我当然知道错误很清楚,这就是我解释的原因,也是我一开始没有发布堆栈跟踪的原因。因为我正在学习使用这个库。不幸的是,在网上,大多数 json 操作都是通过 collection.update 完成的,这不是我想要实现的。我认为使用 $set(参见 mykong update for mongodb javadriver)作为第一个参数,将覆盖 K/V(第二个参数)。你的东西 mongodb java 驱动程序文档充满了例子吗?我什至找不到我想要实现的目标,如果你有链接,请提供它
-
我没有加入聊天可能是因为网速不好。将 K/V 附加到子文档中就像您几乎完成的一样,例如
myClass.getDocument().append("aDictionnary", new BasicDBObject().append("actionId", actionToAttachId ) );
标签: java mongodb mongodb-java nosql