我正在使用Java Mongo驱动程序进行数据库交互。我有定期更新要在数据库行和完全嵌套的对象上执行。像这样:
为MyObject:
{
_id: dbGeneratedId,
myId: "A String ID that i created",
myTime: "new Date()",
myList:
[
{
myString: "abcdefghij",
myInteger: 9000
},
{
myString: "qwertyasdf",
myInteger: 9001
},
{
myString: "loremipsum",
myInteger: 9002
}
]
}
每次更新都涉及在myList
下添加新的List项或将一些字符串附加到每个List项中的myString
对象。我发现了许多用于编写/查找项目的参考,没有用于更新嵌套对象中的项目。有人可以帮我弄这个吗。
编辑1:如果有人指出如何根据myInteger
搜索
PS:mongo thro Java的新手,请原谅我的无知
答案 0 :(得分:2)
您可以使用$push运算符插入新的列表项。
您可以在shell上运行以下命令以添加新的列表项。
db.myObject.update({"myId" : "A String ID that i created"},{$push:{myList: {myString:"new string", myInteger:9003}}})
您可以使用Java Driver添加列表项,如下所示。
DBCollection coll = db.getCollection("myObject");
DBObject query = new BasicDBObject("myId", "A String ID that i created");
DBObject listItem = new BasicDBObject();
listItem.put("myString", "my new string");
listItem.put("myInteger", 9003);
DBObject updateObj = new BasicDBObject("myList", listItem);
coll.update(query, new BasicDBObject("$push", updateObj));
你可以在shell上获得如下单个元素。
db.myObject.find({"myList.myInteger" : 9003}, {"myList.$" : 1})
从Java Driver中,您可以运行相同的代码,如下所示:
DBCursor cur = coll.find(new BasicDBObject("myList.myInteger", 9003), new BasicDBObject("myList.$", 1));
您可以按如下方式删除对象:
db.nested.update({"myId" : "A String ID that i created"},{$pull:{myList: {myString:"new string", myInteger:9003}}})
在Java中,您可以按照以下方式执行此操作:
DBCollection coll = db.getCollection("myObject");
DBObject query = new BasicDBObject("myId", "A String ID that i created");
DBObject listItem = new BasicDBObject();
listItem.put("myString", "my new string");
listItem.put("myInteger", 9003);
DBObject updateObj = new BasicDBObject("myList", listItem);
coll.update(query, new BasicDBObject("$pull", updateObj));
PS:目前无法更新阵列中的所有项目。 Jira有一个未解决的问题。您可以从JIRA-1243
查看