【问题标题】:How to set value in nested BasicDBObject with Java MongoDB driver如何使用 Java MongoDB 驱动程序在嵌套的 BasicDBObject 中设置值
【发布时间】: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')

【问题讨论】:

  • 你要做什么操作,updateinsert?完整的堆栈跟踪信息将有助于分析问题。
  • @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


【解决方案1】:

您尝试过$push 运算符吗?

例子:

db.students.update({ _id: 1 },{ $push: { scores: 89 }})

【讨论】:

  • 这样会直接更新数据库吧?我不想更新它,因为我保留了历史记录,所以每个新条目都是一个新插入。我想做的是在进行新插入之前更新 json。此外,您的示例不会附加到任何子文档。
【解决方案2】:

在你的例子中:

document._parentId = ObjectId()
document.aDictionnary.actionId = Integer
document.aDictionnary.bDictionnary.id = Integer

基本上等于:

{_parentId: ObjectId(), aDictionary: {actionId: actionId,
                                      bDictionnary: {id: id}}

所以有 3 个文档 - 顶层一直到嵌套的 bDictionnary。其中每一个都是DBObject,因此您需要构建DBObject 并酌情保存 - 这是一些未经测试的伪代码:

DBObject myDocument = new BasicDBObject();
myDocument.put("_parentId", ObjectId())
DBObject aDictionary = new BasicDBObject("actionId", actionId)
                           .append("bDictionary", new BasicDBObject("id", id))
myDocument.put("aDictionary", aDictionary)

db.save(myDocument)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多