2015-05-22 12 views
5

Chcę wstawić te wartości do mongodb i tutaj jest mój kod, jestem w stanie go wstawić, ale gdy aktualizowałem tylko access_policy w sekcji admin_section, nie mogłem tego zrobić że ktoś może mi pomóc, jak mogę go rozwiązać: meteor.jsonjak zaktualizować zagnieżdżoną tablicę json za pomocą meteor.js

{ 
    "_id" : ObjectId("555ebffa7c88507a4a683e81"), 
    "section_id" : "Admin Section", 
    "is_active" : true, 
    "admin_section" : [ 
     { 
      "_id" : 1, 
      "info" : "Setup custom access policy for user groups", 
      "sub_section" : "Setup - access policy", 
      "access_policy" : "ROOT" 
     }, 
     { 
      "_id" : 2, 
      "info" : "Customize access policy for main sections", 
      "sub_section" : "Manage - access policy", 
      "access_policy" : "ROOT" 
     }, 
     { 
      "_id" : 3, 
      "info" : "Manage user groups for DX-Client application", 
      "sub_section" : "Manage - user groups", 
      "access_policy" : "ROOT" 
     }, 
     { 
      "_id" : 4, 
      "info" : "Manage users for DX-Client application", 
      "sub_section" : "Create - user", 
      "access_policy" : "ADMINISTRATOR" 
     }, 
    ], 
    "access_policy" : "ADMINISTRATOR" 
    } 

meteor.html

<table class="table table-bordered"> 
     <tbody> 
     {{#each temp_admin_section}} 
      {{#if admin_section}} 
       <tr class="bgLight"> 
        <td class="left" id="one"><b>{{ section_id }}</b></td> 
        <td class="left" id="two"><b>RESTRICTED</b> - <code contenteditable="true" class="edited"><input value="{{ access_policy }}" /></code><a class="add-access pull-right">add</a></td> 
       </tr> 
      {{#each admin_section}} 
       <tr> 
        <td class="left" id="one">{{ sub_section }}</td> 
        <td class="left" id="two">RESTRICTED - <code contenteditable="true" class="edited"> 
        <input value="{{ access_policy }}" /></code></td> 
       </tr> 
      {{/each}} 
      {{/if}} 
     {{/each}} 
     </tbody> 
    </table> 

meteor.js

'change .edited': function(event, template){ 
    var to = event.target.value; 
    var list = to.split(","); 
    map.update(
    {"_id": this._id, "admin_section._id" : 1}, 
    {$set: {"admin_section.$.access_policy": list}} 
); 
} 

Odpowiedz

0

Cały kod po stronie klienta jest uznawany za niezaufany, chyba że zadzwonisz pod numer Meteor.call i zezwolisz na aktualizację po stronie serwera. Jeśli spojrzeć na konsoli, prawdopodobnie będzie zobaczyć błąd takiego:

{ 
    error: 403, 
    reason: "Not permitted. Untrusted code may only update documents by ID.", 
    details: undefined, message: "Not permitted. Untrusted code may only update documents by ID. [403]", 
    errorType: "Meteor.Error" 
} 

Na stronie klienta, można aktualizować tylko 1 dokument naraz, i trzeba wybrać dokument do aktualizacji przez ID, tak 1st argumentem musi być identyfikator dokumentu Mongo, nie selektor Mongo:

MyCollection.update(
    this._id, 
    { 
    $set: { "admin_section.1.access_policy": "TEST" } 
    } 
) 

również do aktualizacji sub-dokument tablicy, zamiast określania identyfikatora w 1. argumentu jako selektor, powiadomienia w jaki sposób określam identyfikator wewnątrz instrukcji $set.

Jeśli chcesz zaktualizować wszystkie elementy w tablicy, trzeba pętli przez wszystkie z nich z osobna:

var doc = MyCollection.findOne(this._id); 
var adminSections = doc.admin_section; 

for (i = 0; i < adminSections.length; i++) { 
    // If you need to access a value in the nested doc: 
    var nestedDoc = adminSections[i]; 
    MyCollection.update(
    this._id, 
    { 
     $set: { "admin_section." + (i+1) + ".access_policy": "someValue" } 
    } 
); 
{ 
+0

to działa tylko dla pierwszej tablicy „admin_section”, ale muszę aktualizować „access_policy” każda tablica jest dynamiczna zgodnie z identyfikatorem tablicy, proszę o pomoc. –

+0

Zobacz zaktualizowaną odpowiedź - czy tego szukasz? –

Powiązane problemy