Primo approccio a mongoDB

Appunti sui problemi e soluzioni nati durante l’esperienza dell’utilizzo di mongoDB.

Windows 7 64 bit
mongoDB versione 2.4.4 (e successivamente 2.4.5)
Driver C# versione 1.8.1
Percorso dei file di mongoDB: C:\mongoDB
Cartella dei database: D:\Databases\mongoDB

2013-06-05

Errore su installazione con percorso personalizzato

Ho seguito alla lettera le istruzioni del tutorial sul sito ufficiale per creare il file di configurazione contenente il path del file di log.
Si presenta un errore riferito al file di configurazione che si è creato: [error per line ‘ |1’] o qualcosa di simile.

Ho risolto seguendo le indicazioni trovate su un articolo in internet, mi pare che abbia dovuto cancellare (l’ho rinominato) il file di configurazione prima di eseguire il comando --install e poi l’ho ricreato (rinominato con il nome originale).
Forse proprio questa operazione è stata la causa del problema riscontrato poi, ovvero il fallimento dell’avvio del servizio “MongoDB”.

2013-06-05

Errore su avvio del servizio “MongoDB”

L’installazione seguendo il tutorial sul sito ufficiale non è riuscita impostando un percorso personalizzato per i database.
Il problema che si presenta è il mancato avvio del servizio “MongoDB”, nel log viene segnalato che non viene trovato il percorso “/data/db” che è il percorso di default per i database.

Ho dovuto usare il comando da console trovato su un articolo in internet per ovviare al problema.
Di fatto il tutorial pur indicando che si può personalizzare il percorso dove verranno salvati i database non dà indicazioni corrette sull’installazione. Nelle FAQ non ho trovato nulla al riguardo.

2013-06-06

Errore “Element ‘_id’ does not match any field or property of class PersonalFinance.Entities.User.

L’errore è dovuto alla mancanza di una proprietà “Id”.


using MongoDB.Bson;
public ObjectId Id { get; set; }

Le mie classi entità si trovano in un apposito progetto, con namespace “Entities”.
Purtroppo essendo usate anche nel progetto di interfaccia (Web site) devo aggiungere la referenza alla libreria a MongoDB.Bson.dll anche in quest’ultimo, e di questo non sono contento.

La proprietà “Id” è anche usata nel metodo Save().

2013-08-05

Nuova installazione su un altro PC

Download del file mongodb-win32-x86_64-2.4.5.zip ed estrazione della cartella bin in S:\mongoDB.

Inizio l’installazione e quindi eseguo il comando:
mongod.exe--dbpath "d:\Databases\mongoDB"

Tutto sembra andare a buon fine in quanto mi trovo con alcuni file creati nella cartella che conterrà i database ed il prompt che mi informa che il server è in ascolto sulla porta 27017, il “waiting for connections message” menzionato dalla guida.
Con un’altra console dos riesco a interagire con il server.

Passiamo all’installazione del servizio.
Come la guida richiede creo la cartella per i log, S:\mongoDB\log.
Poi creo il file s:\mongoDB\bin\mongod.cfg e ci scrivo:
logpath=S:\mongoDB\log\mongo.log
senza andare a capo a fine linea.

Poi però aggiungo l’opzione per indicare il percorso dei database, quindi su una nuova linea:
dbpath=D:\Databases\mongoDB
e non vado a capo a fine linea.

Ora eseguo il comando per installare il servizio:
mongod.exe --config S:\mongoDB\bin\mongod.cfg --install

Ok, dopo il primo errore “Access is denied (5)” riprovo facendo partire la console DOS con “Run as administrator”.
Servizio installato.
Con il comando net start mongoDB dovrebbe partire…

E invece:

The Mongo DB service could not be started.
A system error has occurred.
System error 1067 has occurred.
The process terminated unexpectedly.

Mi stavo già per arrabbiare, ma poi vedo che in Notepad++ il file mongod.cfg non è salvato.
Lanciando il comando mongo nell’output si legge che sta cercando di accedere alle cartelle /data/db che non vengono trovate.
Uso mongod --remove per rimuovere il servizio e dopo aver salvato il file mongod.cfg ripeto installazione e starto il servizio. Questa volta funziona tutto.

2013-10-26

Unique key

Dovendo associare all’utente loggato nella mia applicazione una valuta ho pensato di creare un’entità “Currency” contenente il nome ed il simbolo della valuta. Non volendo creare Model, View e Controller per inserire 2 valute (euro e dollaro) ho optato per l’altra via: usare la shell. In realtà ho usato un file script (.js) che richiamo con un semplice doppio click. Devo dire che però inserire e semplici recor in una tabella di 3 campi (“Code”, “Name” e “Symbol”) e poi la chiave indice univoco sul campo “Code”, non è stato immediato. Poi ho dovuto collegare ai document “Account” (la mia collection per gli utenti) le “Curency”. Anche qui tramite script.
I simboli (inseriti con il file script) non vengono mostrati, forse dovrei usare la stringa ”\u20ac” per l’euro.
Volevo creare in prima battuta degli oggetti falsi, invece comunque ho dovuto creare l’entità “Currency” e la classe CurrencyRepository che mi legge dal database la Currency. Con un database relazionale avrei creato sul database come indice univoco e chiave primaria il solo campo “Code” e quindi sarebbe stato immediato creare gli oggetti in memoria.

2013-10-26

Oggetti relazionati

Ho ora un problema con gli oggetti relazionati.
Nella documentazione ufficiale si consiglia di usare l’embed per tenere le relazioni tra gli oggetti, in quanto altrimenti necessitano più query per ottenere il dato.
In questo modo però l’aggiornamento dell’oggetto relazionato (di alcune sue proprietà) non si ripercuote in tutti gli oggetti dove è stato inserito. Se invece nell’oggetto iniziale si inserisce solo un campo che serva per relazionare le entità, nel caso di liste dell’oggetto di partenza come si ottengonop gli oggetti relazionati (quello che in SQL sarebbe un inner join)? E nel caso di ulteriori sotto-relazioni?
Se non trovo una soluzione semplice a questo, dovrò passare tutto il progetto che ho basato su mongoDB ad un database relazionale (SQL Server + NHibernate, sono la scelta più probabile).

Alla fine sono passato a SQL Server perché le mie entità sono tutte relazionate e lavorare con Mongo su entità relazionate è un delirio.

Add jQuery to SharePoint

Disclaimer

I am referring to SharePoint 2010, I have used my Foundation version instance. I have not tested this in SharePoint 2013 but I think some information here are absolutely good for it.
There are some ways to accomplish this task, I show you the best and I will motivate it.

Get jQuery

First of all you need to download the jQuery minified of the version you want, usually the last one is the right choice if you have not particular needs (jQuery download page). The current latest one is jquery-1.10.1.min.js file.

Put jQuery on SharePoint folder

On SharePoint server you have to go in the “LAYOUTS” folder and create a folder for your site, it will be useful for more files other than jQuery. Then add a “Scripts” folder. I remember you that the 14 folder is usually in C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14.
So now you have ..\14\TEMPLATE\LAYOUTS\[MySite]\Scripts. [MySite] in my case is “portal.alex75.it” (yes, with dots in the name), exactly the site collection I am using for this example.
Put in this folder the downloaded jQuery file.

Add script reference in master page

The master page that you must edit for sure is the v4.master. After you test the result is ok on it you can do the same thing for the others, they can be used in some circumstances, this is an explanation of their roles:
v4.master > The default master page.
default.master > It is used to support the 2007 user interface.
minimal.master > It is used for the requests from mobile devices
simple.master > It is used for accessdenied.aspx, confirmation.aspx, error.aspx, login.aspx, reqacc.aspx, signout.aspx and webdeleted.aspx pages (I haven’t this one in my SharePoint 2010 Foundation).

With SharePoint Designer use the context menu (right click) on the master you want to edit and select “Edit file in advanced mode“.
You have can find “<SharePoint:CustomJSUrl runat=”server” />” and add the script after this. It is after “core.js”.
It is important that the script you add (jQuery reference) is before the “<asp:ContentPlaceHolder id=”PlaceHolderAdditionalPageHead” runat=”server”/>” because in this manner jQuery was loaded before additional scripts in .aspx pages, in fact additional scripts in pages are added in this place holder.
So the result can be something like this:
jQuery Script in master page
I omit type on script element because I use to change the doctype to HTML5 (<!DOCTYPE html>).
In HTML5 script tag has default for type as “text\javascript” thus it is not needed.
You can use this:

Details and comment

The “official” way to add a script is using the SharePoint:ScriptLink tag but if you not need to use “SP” namespace (or other dependencies) the simplest HTML syntax is the best.
The “official” folder to add things like scripts and images is the Style Library folder but for a bug requests on this path are returned with a HTTP 304 response, so the “refresh” of the files are sometimes impeded. Now, there is the “Site Assets” library but this one is accessed by users with interface and I prefer not to risk someone modify or delete files so important.

Example code for cut&paste

<SharePoint:ScriptLink language="javascript" name="core.js" OnDemand="true" runat="server"/>
<SharePoint:CustomJSUrl runat="server" />
<!-- customization -->
<script type="text/javascript" src="/_layouts/portal.alex75.it/Scripts/jquery-1.10.1.min.js"></script>
<script>alert("jQuery version: " + $.fn.jquery);</script>
<SharePoint:SoapDiscoveryLink runat="server"/>
<asp:ContentPlaceHolder id="PlaceHolderAdditionalPageHead" runat="server"/>