ReactiveMongo: невозможно удалить документ из массива с помощью Reactive Mongo Query DSL

Я пытаюсь удалить документ из массива, используя реактивный DSL Query mongo. Моя структура документа выглядит следующим образом:

{
"_id" : ObjectId("55950666c3ad8c860b5141cc"),
"name" : "Texla",
-------------------------
 "location" : {
    "_id" : ObjectId("5595074bc3ad8c19105141d0"),
    "companyFieldId" : ObjectId("559140f1ea16e552ac90e058"),
    "name" : "Location",
    "alias" : "Site",
    "locations" : [
        {
            "_id" : ObjectId("5595074bc3ad8c19105141d1"),
            "country" : "India",
            "state" : "Punjab",
            "city" : "Moga",
            "zip" : "142001",
            "custom" : false
        },
        {
            "_id" : ObjectId("5595074bc3ad8c19105141d2"),
            "country" : "India da address",
            "custom" : true
        }
    ]
},
------------------------
}

Мой запрос с использованием «Реактивных расширений Mongo»:

genericCompanyRepository.update($doc("_id" $eq BsonObjectId.apply("55950666c3ad8c860b5141cc")), $pull("location.locations" $elemMatch("_id" $eq BsonObjectId.apply("5595074bc3ad8c19105141d1"))), GetLastError(), false, false);

С приведенным выше заявлением об обновлении. нет документа, который вытягивается из массива. В чем проблема с запросом?

Когда я запускаю функцию ниже, это будет работать.

genericCompanyRepository.findOne($doc("location.locations" $elemMatch("_id" $eq BsonObjectId.apply("5595074bc3ad8c19105141d1")))) function, the element is return. 

person Harmeet Singh Taara    schedule 02.07.2015    source источник


Ответы (2)


Я использую Play-ReactiveMongo и обновляю запрос в синтаксисе монго, как показано ниже. :

db.collectionName.update({"_id" : ObjectId("55950666c3ad8c860b5141cc"),
                         "location.locations":{"$elemMatch":{"_id":ObjectId("5595074bc3ad8c19105141d1")}}},
                         {"$pull":{"location.locations":{"_id":ObjectId("5595074bc3ad8c19105141d1")}}})

И этот запрос в salat mongo, как показано ниже:

val query = List(MongoDBObject("_id" -> new ObejectId("55950666c3ad8c860b5141cc"),
                         "location.locations" -> MongoDBObject("$elemMatch" -> MongoDBObject("_id"-> new ObjectId("5595074bc3ad8c19105141d1")),MongoDBObject("$pull"-> MongoDBObject("location.locations" -> MongoDBObject("_id": new ObjectId("5595074bc3ad8c19105141d1"))))

и обновите это в коллекции, как показано ниже:

db.collectionName.update(query)

Я не использую reactive Mongo напрямую, но после просмотра вашего кода для запроса на обновление вы должны изменить синтаксис, как показано ниже, обратите внимание, что синтаксис запроса ниже не тестировался.

genericCompanyRepository.update($doc("_id" $eq BsonObjectId.apply("55950666c3ad8c860b5141cc")
  "location.locations" $elemMatch("_id" $eq BsonObjectId.apply("5595074bc3ad8c19105141d1")), 
$pull("location.locations"("_id" $eq BsonObjectId.apply("5595074bc3ad8c19105141d1")),
GetLastError(), false, false);
person Yogesh    schedule 02.07.2015
comment
спасибо @yogesh, но с этим кодом возникает проблема genericCompanyRepository.update($doc("_id" $eq BsonObjectId.apply("55950666c3ad8c860b5141cc") "location.locations" $elemMatch("_id" $eq BsonObjectId.apply("5595074bc3ad8c19105141d1")), pull("location.locations"("_id" $eq BsonObjectId.apply("5595074bc3ad8c19105141d1")), GetLastError(), false, false); проблема с оператором $doc("_id" $eq BsonObjectId.apply("55950666c3ad8c860b5141cc") "location.locations" $elemMatch("_id" $eq BsonObjectId.apply("5595074bc3ad8c19105141d1")). - person Harmeet Singh Taara; 02.07.2015
comment
@HarmeetSinghTaara этот запрос не тестировался с использованием reactive Mongo, поэтому, возможно, вам следует преобразовать запрос mongo в reactivemongo. Я попробую использовать reactive mongo и очень скоро обновлю, так что тем временем вы должны попробовать сами :) - person Yogesh; 02.07.2015
comment
@HarmeetSinghTaara, не волнуйся :) - person Yogesh; 03.07.2015

С помощью ответа выше @yogesh я решаю свою проблему, ниже приведен мой обновленный запрос.

genericCompanyRepository.update($doc("_id" $eq BsonObjectId.apply("55950666c3ad8c860b5141cc"), "location.locations" $elemMatch("_id" $eq BsonObjectId.apply("5595074bc3ad8c19105141d1"))), 
      $pull("location.locations" $eq $doc("_id" $eq BsonObjectId.apply("5595074bc3ad8c19105141d1"))), GetLastError(), false, false);
person Harmeet Singh Taara    schedule 03.07.2015