2014-02-21 5 views
0

В настоящее время я занимаюсь разработкой приложений мы используем MongoDB Я новичок в этом, и я столкнулась со многими проблемами, когда дело доходит до сложных обновленийMongoDB обновления внутри 2 вложенных массивов объектов

Это наши заказы коллекции:

{ 
    "_id" : ObjectId(), 
    "company" : String, 
    "employee" : String, 
    "office" : String, 
    "status" : String, 
    "subOrders" : [ 
    { 
     "products" : [ 
      { 
       "productId" : ObjectId(), 
       "name" : String, 
       "price" : String, 
       "status" : String 
      } 
     ], 
     "tax" : Int, 
     "subTotal" : Int, 
     "total" : "Int, 
     "status" : String, 
     "orderNote" : String 
    } 
    ] 
} 

Мы должны совершить обновление, как показано ниже

update the subOrders.products.status to something (for example : delivered) 

где

company = "x company" and office = "y office" and subOrders.products.productId = "z id" 

может кто-нибудь пожалуйста, предоставьте нам чистый код, который может обрабатывать этот запрос

пожалуйста, не содержат ссылки на блоги или веб-сайты, если они не нацелены на очень подобный вопрос

заранее спасибо

ответ

1

вы могли бы попробовать что-то вроде этого (это будет здорово, но ... посмотрите на обновление вопрос части):

db.coll.update(
    { company: "x company", office: "y office", "subOrders.products.productId": "z id"}, 
    { $set: { "subOrders.$.products.$.status": "delivered" } } 
) 

Также вы можете прочитать эту DOCUME ntation об операциях обновления: http://docs.mongodb.org/manual/reference/method/db.collection.update/

Обновление:
Ops .. Извините, но позиционная оператор ($) не работают с вложенными массивами ... Вы можете увидеть его на JIRA, а также в documentation.
Некоторые смежные вопросы: 12,
Вы можете использовать "subOrders.$.products.0.status" вместо "subOrders.$.products.$.status", если это возможно в вашем случае. Но будет лучше, если вы добавите некоторые изменения в свою схему и избавитесь от необходимости обновлять документы во вложенных массивах.
Но в целом синтаксис обновления выглядит так, как показано выше.

Update 2:
Для поиска только один документ и обновить status только одного продукта только один подотряд вы могли бы сделать что-то вроде этого:

var productIdForUpdate = "z id"; 
var doc = db.coll.findOne({ company: "x company", office: "y office", "subOrders.products.productId": productIdForUpdate }); 
top: 
for(var i = 0; i < doc.subOrders.length; i++) { 
    var subOrder = doc.subOrders[i]; 
    for(var j = 0; j < subOrder.products.length; j++) { 
     var product = subOrder.products[j]; 
     if (product.productId == productIdForUpdate) { 
      eval('db.coll.update({ _id: doc._id }, { $set: { "subOrders.' + i + '.products.' + j + '.status": "delivered" } })'); 
      break top; 
     } 
    }  
} 

или:

var productIdForUpdate = "z id"; 
var doc = db.coll.findOne({ company: "x company", office: "y office", "subOrders.products.productId": productIdForUpdate }); 
top: 
for(var i = 0; i < doc.subOrders.length; i++) { 
    var subOrder = doc.subOrders[i]; 
    for(var j = 0; j < subOrder.products.length; j++) { 
     var product = subOrder.products[j]; 
     if (product.productId == productIdForUpdate) { 
      product.status = "delivered"; 
      db.coll.save(doc); 
      break top; 
     } 
    }  
} 

Показанный код обновляет только один продукт с определенным индексом только в одном подоператоре. Если вы хотите обновить более одного документа или более одного подоператора ... или более одного продукта, вы должны добавить некоторые изменения в этот код.

+0

Спасибо за редактирование ответа, я тоже заметил, и я понял, что оператор $ для вложенных массивов не работает, второй вариант возможен, если у нас есть индекс точных продуктов, которые нам нужно обновить, поэтому давайте изменим вопрос к этому : Если у нас есть все вышеуказанные критерии, то я имею в виду: {компания: «x компания», офис: «y office», «subOrders.products.productId»: «z id»} Можно ли получить индекс массив subOrders.products, который соответствует критериям, а затем с помощью обновления индекса, который – Siavosh

+0

Спасибо за ваш ответ, хотя для его работы потребовалась небольшая модификация – Siavosh

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