Reputation: 1208
I am using Java Mongo driver for the DB interaction. I have regular updates to be performed on the DB rows and the object that is quite nested. Something like this :
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
}
]
}
Each update involves either adding a new List item under myList
or appending some string to the myString
object in each of the List item. I found a lot of references for writing/finding items and none for updating items in a nested object. Can someone help me with this.
Edit 1: It would also be helpful if someone points out how to get one of the List items based on a myInteger
search
PS: new to mongo thro Java, excuse my ignorance
Upvotes: 2
Views: 3456
Reputation: 26012
You can insert new list item using the $push operator.
You can run the following command on the shell to add new list item.
db.myObject.update({"myId" : "A String ID that i created"},{$push:{myList: {myString:"new string", myInteger:9003}}})
You can add list item using Java Driver as follows.
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));
You can get single element as follows on the shell.
db.myObject.find({"myList.myInteger" : 9003}, {"myList.$" : 1})
From Java Driver you can run same code as follows :
DBCursor cur = coll.find(new BasicDBObject("myList.myInteger", 9003), new BasicDBObject("myList.$", 1));
You can remove object as follows :
db.nested.update({"myId" : "A String ID that i created"},{$pull:{myList: {myString:"new string", myInteger:9003}}})
In Java you can do it as follows :
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 : Currently it is not possible to update all items in an array. There is an open issue on the Jira. You can check it from JIRA-1243
Upvotes: 2