Retreiving nested json or a tree from ArangoDB - database

ArangoDB is great for retrieving a graph of data. A tree is a kind of graph.
We want to store data of buildings in a database. The structure of a building can be thought of as a hierarchy of parts.
The data structure is very simple: assemblies containing other assemblies, unlimited levels deep.
Assemblies are stored as documents, and linked by an edge collection contains.
The data that I need, can be fetched with
FOR v, e, path IN 1..3 OUTBOUND
'assemblies/14810426' contains
RETURN path
The data is there, however, I want to have a json like
{name: "Office Building",
assemblies: [{name: "Director's office",
assemblies: [{name: "Chair"}, {name: "Desk"}]},
{name: "Toilet}]}
Is there a way to get this format straight from ArangoDB, or do I need to write code myself to convert the graph path to a tree?
I guess writing a Foxx service is an option, but I would like to avoid that.
There is a similar question, with answer, but that was for the previous version of ArangoDB. It requires a bit of foxx code. I was hoping to have a solution, straight from AQL.

You could make use of subquery to aggregate results and add it to your return result.
AQL Query like this
FOR doc IN assemblies
FILTER doc._id=='assemblies/14810426'
LET conn_docs=(
FOR v,e,path IN 1..3
OUTBOUND doc contains RETURN {'name':v.name}
)
RETURN {'name':doc.name,'assemblies':conn_docs}
would do the task, which aggregates the connected assemblies to a query doc and place those in the return result

I know you want to avoid Foxx, but if interested I've answered this for someone else who wanted to have recursive nesting for menu trees.
Have a look at my answer for Arangodb AQL recursive graph traversal
for more info.

Related

Automatic Grouping/Sorting of Nested-Lists?

I am currently trying to implement a web tool with a capable web developer, but we are stuck on one functionality.
It's about draggable nested lists, which should be grouped and sorted automatically according to different attributes.
The "draggable" is not the problem but the automatic creation of parent & child nested lists and the automatic distribution of the products into the corresponding lists.
For a better understanding I have made a
Figma-Prototype, maybe you will understand what I mean.
I have a database of products with attributes like "producer", "product category", "sub-category", "country" and "region". (However the example is just a table, in reality we made the DB in MongoDB)
I want the user to be able to change the order (drag&drop) and also create new lists(Nested-List Parents & Childrens). However, I would like to spare the Users from having to start at 0 and create and fill all lists manually, for example, when it its just about grouping and sorting "only" by product category.
Is this even Possible? We are working with React (MERT-stack).
Thank you!!
We havent an idea where to start, tbh.

Best way to store a single independent document in mongodb

I have MERN application, I have a bunch of collections in my db, now i want to store an object that represents an order:
Say i have "item1, item2, item3" in an "items" collection, each one can be anything really;
I just need the Id's (to reference them), I want the user to choose their order so that i know the correct way of displaying the items (Not the order in the db, an order for a seprate purpose)
I think the best way of doing it is having a single document, with the order data in it, but each document should be in a collection, so the question is, is it right to create a collection only to store a single document in it? or is there a better way?
This is an example of the document i want to store: (The array index is their order)
{
items: [{itemId:xxx, otherprops...}, {itemId: yyy, otherprops...}]
}
The items collection can have 100s of items, so changing the order in that collection is not the correct option for my needs.
is it right to create a collection only to store a single document in
it
If you look at the admin database in mongodb, you'll see that it does something similar to what I think you're trying to do. There's a system.version collection. In that collection, I've seen documents that contain settings-like information. For example, the featureCompatibility property is actually stored as a document with _id: "featureCompatibility". Shard identity information is also stored as a single document in this collection:
{
"_id" : "shardIdentity",
"clusterId" : ObjectId("2bba123c6eeedcd192b19024"),
"shardName" : "shard2",
"configsvrConnectionString" : "configDbRepl/alpha.example.net:28100,beta.example.net:28100,charlie.example.net:28100" }
There is only one such document in the system.version collection. You can very well create your own settings collection where you store these bespoke documents. It's certainly not unheard of.
Take a look at the "Shard Aware" section from the official mongodb documentation to see this type of practice in action:
https://docs.mongodb.com/manual/release-notes/3.6-upgrade-sharded-cluster/#prerequisites

SuiteCommerce Advanced - Show a custom record on the PDP

I am looking to create a feature whereby a User can download any available documents related to the item from a tab on the PDP.
So far I have created a custom record called Documentation (customrecord_documentation) containing the following fields:
Related item : custrecord_documentation_related_item
Type : custrecord_documentation_type
Document : custrecord_documentation_document
Description : custrecord_documentation_description
Related Item ID : custrecord_documentation_related_item_id
The functionality works fine on the backend of NetSuite where I can assign documents to an Inventory item. The stumbling block is trying to fetch the data to the front end of the SCA webstore.
Any help on the above would be much appreciated.
I've come at this a number of ways.
One way is to create a Suitelet that returns JSON of the document names and urls. The urls can be the real Netsuite urls or they can be the urls of your suitelet where you set up the suitelet to return the doc when accessed with action=doc&id=_docid_ query params.
Add a target <div id="relatedDocs"></div> to the item_details.tpl
In your ItemDetailsView's init_Plugins add
$.getJSON('app/site/hosting/scriptlet.nl...?action=availabledoc').
then(function(data){
var asHtml = format(data); //however you like
$("#relatedDocs").html(asHtml);
});
You can also go the whole module route. If you created a third party module DocsView then you would add DocsView as a child view to ItemDetailsView.
That's a little more involved so try the option above first to see if it fits your needs. The nice thing is you can just about ignore Backbone with this approach. You can make this a little more portable by using a service.ss instead of the suitelet. You can create your own ssp app for the function so you don't have to deal with SCAs url structure.
It's been a while, but you should be able to access the JSON data from within the related Backbone View class. From there, within the return context, output the value you're wanting to the PDP. Hopefully you're extending the original class and not overwriting / altering the core code :P.
The model associated with the PDP should hold all the JSON data you're looking for. Model.get('...') sort of syntax.
I'd recommend against Suitelets for this, as that's extra execution time, and is a bit slower.
I'm sure you know, but you need to set the documents to be available as public as well.
Hope this helps, thanks.

Serialize Old App Engine 'db' Queryset into JSON

I'm just working on a rather dated project on App Engine that still uses the old 'db' model format instead of 'ndb'.
What would be the simplest way to serialize a 'db' query into JSON?
For example:
sections = Section.all() >>> JSON
All of the methods that I found from a google search use the to_list method of 'ndb' models.
Thanks!!!
A quick read of the docs (you have done that ?) turns up to_dict https://cloud.google.com/appengine/docs/python/datastore/functions?hl=en#to_dict which allows you to transform a model entity to a dictionary. Dictionaries can be transformed to JSON (unless they have Decimal values and a few other types, but I am sure you can work around that.). Then just iterate over the query result, producing a list of dicts, which you can json.dump(thelist)
However if you have a lot of entities you will have to take some additional steps, but you can read the docs to work out that.

ModX Revo Database: Relation between member groups and document groups

I'm creating some custom queries and need to figure out the relation between Member Groups and Document Groups.
My ultimate goal is to display the resources belonging to a particular User Group when a user log in. I am able to get their User ID from Sessions and so the relations I have figured out so far are:
User ID -> Member Groups Table -> ??Unknown table that pairs Member Groups with Document Groups?? -> Document Groups Table- > Resources Table
I just cant find that missing table(s)!
If any one can help me out that would be awesome!
Thanks
(ps: using Revo)
EDIT: added image for assitance
You could use some of the built-in MODX methods to achieve this.
This is not tested and might not work, but this might be a way to do it:
// userGroups = membergroups
$userGroups = $user->getUserGroups();
foreach ($userGroups as $userGroup) {
$resGroups = $userGroup->getResourceGroups();
foreach ($resGroups as $resGroup) {
$resources = $resGroup->getResources();
// merge resources into an array or something
}
}
Check out moduser.class.php, modusergroup.class.php, and modresourcegroup.class.php to see the queries behind these methods. You might be able to adapt them to one more efficient query.
Also, if I haven't misunderstood what you want to achieve then your results should be similar to what a user would see in the resource tree in the manager when logged in?
That uses the resource/getnodes.class.php processor, which retrieves all possible resources for each context using getCollection, then loops through each and decides whether to display or not by using $resource->checkPolicy('list'). That might be another approach to consider.
I usually work with custom data rather than MODX resources so would be keen to hear how you get on with this.
I know this is really, really old, but I came across this question looking for the answer myself. After a bit more digging I've found that it's the access_resource_groups table that links document_groups and member_groups
document_groups.id = access_resource_groups.target
member_groups.id = access_resource_groups.principal

Resources