2015-08-24 4 views
2

Привет всем У меня есть коллекция, как этот ` "_id": ObjectId ("55dabba974cd60712be24443"),Обновление списка вложенных массив в MongoDB Java

"entityType" : "1", 
    "entityCreatedDate" : "08/24/2015 12:07:20 PM", 
    "nameIdentity" : [ 
      { 
        "givenNameOne" : "JOY", 
        "givenNameThree" : "BRAKEL", 
        "lastName" : "BRAKEL", 
        "createdDate" : "08/24/2015 12:07:20 PM", 
        "sourceId" : [ 
          { 
            "sourceId" : "55dabba974cd60712be24441" 
          } 
        ] 
      }, 

    ], 

Here name identity is a list as well as sourceId. I am trying to update sourceId list in nameIdentityList if it matches the names. My java code is :

Document sourceDocument=new Document("sourceId",sourceId); 
mongoDatabase.getCollection("entity").updateOne(new Document("entityId", entityId).append("nameIdentity.givenNameOne","JOY"), 
           new Document("$push", new Document("nameIdentity.sourceId", sourceDocument))); 

` Но я получаю исключение, например java.lang.RuntimeException: com.mongodb.MongoWriteException: не может использовать часть (nameIdentity of nameIdentity.sourceId) для перемещения элемента ({nameIdentity.

Если мое условие n выполняется следующим образом:

`"_id" : ObjectId("55dabba974cd60712be24443"), 

     "entityType" : "1", 
     "entityCreatedDate" : "08/24/2015 12:07:20 PM", 
     "nameIdentity" : [ 
       { 
         "givenNameOne" : "JOY", 
         "givenNameThree" : "BRAKEL", 
         "lastName" : "BRAKEL", 
         "createdDate" : "08/24/2015 12:07:20 PM", 
         "sourceId" : [ 
           { 
             "sourceId" : "55dabba974cd60712be24441" 
           }, 
           { 
             "sourceId" : "55dabba974cd60712be24435" 
           } 
         ] 
       }, 

     ],` 

. любые предложения, в которых я ошибаюсь? У меня есть несколько имен в моем имени. Даже если совпадающий документ второй или третий, sourceId всегда привязывается к первому документу. Как мне обновить конкретный согласованный документ.

ответ

1

Вы пропустили positional $ оператор после поля «nameIdentity» в $push:

Document sourceDocument=new Document("sourceId",sourceId); 
mongoDatabase.getCollection("entity").updateOne(
    new Document("entityId", entityId).append("nameIdentity.givenNameOne","JOY"), 
    new Document("$push", new Document("nameIdentity.$.sourceId", sourceDocument)) 
); 

$push действие, как и другие модификаторы действий обновления необходимо знать «индекс» совпавшего элемента массива, чтобы работать дальше. В противном случае возникает ошибка, о которой вы сообщали.

+0

У меня есть несколько имен в моем имени. Даже если совпадающий документ второй или третий, sourceId всегда прикрепляется к первому документу. Как я могу обновить согласованный документ. –

+0

@ShaikMujahidAli Позиционный оператор '$' (как также поясняется на странице руководства вручную) не возвращает согласованный индекс ничего, кроме «первого» события соответствия, которое всегда означает «внешний» массив. В этом случае вам нужен только «внешний индекс», так что это нормально. Это будет добавлено к соответствующему индексу любых условий запроса для этого массива. В вашем случае, независимо от названия. Но если бы у вас была «РАДОСТЬ» более одного раза, то только первая была сопоставлена. Однако заданный вами вопрос не использовал позиционный оператор '$' вообще. –

Смежные вопросы