How to update json nested array using meteor.js

I want to paste these values โ€‹โ€‹into mongodb, and here is my code, I can paste it, but when I only updated access_policy inside admin_section, I couldnโ€™t do this, can someone help me, how can I solve this: meteor.json

{ "_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}} ); } 
+5
source share
1 answer

All client code is considered untrustworthy if you do not call Meteor.call and do not allow the server method to perform the update. If you look in the console, you will probably see an error, for example:

  { 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" } 

On the client side, you can only update one document at a time, and you must select the document to update by ID, so the first argument should be the identifier of the mongo document, not the mongo selector:

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

Also, to update the array subdocument, instead of specifying the identifier in the first argument as a selector, notice how I specify the identifier inside the $set operator.

If you want to update all the elements in the array, you must execute them individually:

 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
source

All Articles