2014-01-09 2 views
2

Например у меня есть эта структура:MongoDB продолжают тянуть из текущего документа

> db.test.find().pretty() 
{ 
    "_id" : ObjectId("52ce7b49074b355233e6e2fb"), 
    "gifts" : [ 
     { 
      "gid" : "lala", 
      "reserv" : [ 
       555, 
       666 
      ] 
     }, 
     { 
      "gid" : "bebe", 
      "reserv" : [ 
       888, 
       555 
      ] 
     } 
    ], 
    "uid" : 123 
} 

Я хочу, чтобы вытащить «555» из всех «Reserv» и из всех документов «UID» и содержание «Reserv»:

1) Этот запрос найти первые 555 и вытащить его, но второй 555 в документе не тянуть:

db.test.update({uid : 123, 'gifts.reserv': 555}, {'$pull' : {'gifts.$.reserv' : 555}}, {multi : true}) 

2) в этом ничего запросе сделать:

db.test.update({uid : 123, 'gifts.reserv': 555}, {'$pull' : {'gifts.reserv' : 555}}, {multi : true}) 

Поэтому я не могу продолжить обновление последнего документа обновления.

Как решить эту проблему?

ответ

1

Боюсь, что это невозможно. Лучшее, что вы можете сделать, это:

  • сделайте поиск в своей коллекции, чтобы получить нужный документ.
  • на документе, подсчитывают количество подарков, который имеет reserv из 555
  • выполнить update + pull, что количество раз.
+0

Итак, я думаю, что это «шип». Лучшее решение - перестроить коллекцию, чтобы раскрутить массив подарков или сделать отдельную коллекцию подарков. – Logioniz

+0

Что значит «шип»? – rednaw

+0

Плохое решение этого вопроса. – Logioniz

0

Многофункциональный режим не будет иметь никакого эффекта здесь, потому что установка multi в true будет выглядеть по нескольким документам, но здесь одно и то же значение встречается в нескольких вспомогательных документах. Таким образом, вам нужно манипулировать через вспомогательные документы.

так что вы должны попробовать что-то вроде этого.

while(db.test.find({uid : 123,'gifts.reserv':555}).count()!=0) 
{ 
    db.test.update(
     {uid : 123,'gifts.reserv':555}, 
     {$pull:{'gifts.$.reserv':555}} 
    ) 
} 
+0

Приятно, что вы можете сделать это в одной команде, однако, интересно, будет ли это эффективно, если это произойдет во множестве поддокументов, потому что он выполняет функции 'db.test.find ({uid: 123, 'gifts. reserve ': 555}). count() 'каждый раз. – rednaw

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