Pregunta

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

¿Fue útil?

Solución

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top