Как обновить значение конкретного внедренного документа внутри массива конкретного документа в MongoDB? - PullRequest
10 голосов
/ 15 сентября 2011

В моем документе следующая структура:

{
  _id : ObjectId("43jh4j343j4j"), 
  array : [
            { 
              _arrayId : ObjectId("dsd87dsa9d87s9d7"),
              someField : "something",
              someField2 : "something2"
            },
            { 
              _arrayId : ObjectId("sds9a0d9da0d9sa0"),
              someField : "somethingElse",
              someField2 : "somethingElse2"
            }
   ]
 }

Я хочу обновить someField и someField2 , но только для одного из элементов в массиветот, который соответствует _arrayId (например, _arrayId : ObjectId("dsd87dsa9d87s9d7"); и только для этого документа (например, _id : ObjectId("43jh4j343j4j")), и не имеет других.

arrayIds не являются уникальнымик документу, поэтому мне нужно, чтобы он был для конкретного документа. Я мог бы использовать $ positional operator, если бы я хотел обновить это значение в массиве для каждого документа, в котором он существует, но это не то, что я хочу.

Я пытаюсь сделать это в , но решение командной строки также подойдет.

Ответы [ 3 ]

20 голосов
/ 15 сентября 2011

Вот решение РамешВела, переведенное на :

    DB db = conn.getDB( "yourDB" ); 
    DBCollection coll = db.getCollection( "yourCollection" );

    ObjectId _id = new ObjectId("4e71b07ff391f2b283be2f95");
    ObjectId arrayId = new ObjectId("4e639a918dca838d4575979c");

    BasicDBObject query = new BasicDBObject();
    query.put("_id", _id);
    query.put("array._arrayId", arrayId);

    BasicDBObject data = new BasicDBObject();
    data.put("array.$.someField", "updated");

    BasicDBObject command = new BasicDBObject();
    command.put("$set", data);

    coll.update(query, command);
14 голосов
/ 15 сентября 2011

Вы все еще можете использовать оператор $ positional для этого.Но вам нужно указать объект родительского документа вместе с фильтром _arrayid.Приведенный ниже запрос командной строки работает нормально

db.so.update({_id:ObjectId("4e719eb07f1d878c5cf7333c"),
              "array._arrayId":ObjectId("dsd87dsa9d87s9d7")},
              {$set:{"array.$.someField":"updated"}})
0 голосов
/ 19 сентября 2018

... и вот как это сделать с версией mongo-драйвера> = 3.1 (у меня 3.2.2):

final MongoClient mongoClient = new MongoClient(new MongoClientURI(mongoURIString));
final MongoDatabase blogDatabase = mongoClient.getDatabase("yourDB");
MongoCollection<Document> postsCollection = blogDatabase.getCollection("yourCollection");

ObjectId _id = new ObjectId("4e71b07ff391f2b283be2f95");
ObjectId arrayId = new ObjectId("4e639a918dca838d4575979c");

Bson filter = Filters.and(Filters.eq( "_id", id ), Filters.eq("array._arrayId", arrayId));
Bson setUpdate = Updates.set("array.$.someField", "updated");
postsCollection.updateOne(postFilter, setUpdate);
...