I have a collection of a post when a user comment on a post it will be maintain in an embedded documents of named comments.Now a problem is I have to sent a push notification at every 2 hours like this You have 12 new comments on this post for an owner of this post.
Now after clicking on push notification it redirect me to that comments after seen those comments.Now if a new comments is against post then after 2 hours i will be getting like this You have 3 new comments on this post
You can see in my schema that i will maintain total_comments fields.Problem is how i managed this push notification time based and how to identify and maintain track record of new comments.Should i add some key in schema and write a cron jobs to send push notification
Any help would be appreciated
Here is my record
{
"_id" : ObjectId("57b3aa2db630347c1f9308b4"),
"updated" : ISODate("2016-08-30T05:05:18.301Z"),
"created" : ISODate("2016-08-17T00:05:01.354Z"),
"createdTimeStamp" : 1471392301,
"likes" : [],
"comments" : [
{
"created" : 1471935213,
"user" : ObjectId("57b33c810a56a0a81a9b50b7"),
"text" : "next party",
"_id" : ObjectId("57bbf2edee7a923c156c2f08")
},
{
"created" : 1471935612,
"user" : ObjectId("57b33c810a56a0a81a9b50b7"),
"text" : "its new party ",
"_id" : ObjectId("57bbf47cddd701302ba14fca")
},
{
"created" : 1471935717,
"user" : ObjectId("57b33c810a56a0a81a9b50b7"),
"text" : "its new again",
"_id" : ObjectId("57bbf4e5f934024c275f4f08")
},
],
"total_comments" : 3,
"consumer_id" : ObjectId("57b33c810a56a0a81a9b50b7") // Original User that receive notification
}
There is two way to count new comments I guess.
First :
Storing in your user schema a key lastVisit.
And then do something like db.posts.count({'comments.created': { $gte: $$$YOUR lastVisit$$$ }});
comments.created must become a date.
Second :
Storing a key read: boolean in comments and false by default.
Then every time a user read the notification change this value to true.
And then count the new comments like this db.posts.count({'comments.read': false})
Then I don't know the best choice between a cron task or a setInterval
Related
So I have a collection called "contributors." Within that collection the objects look like this:
{
"_id" : ObjectId("5ef1f75f7e6fb579ed3e5e8a"),
"#attributes" : {
"cand_name" : "name",
"cid" : "",
"cycle" : "",
"origin" : "",
"source" : "",
"notice" : ""
},
"contributor" : [
{
"#attributes" : {
"org_name" : "National Beer Wholesalers Assn",
"total" : "20000",
"pacs" : "20000",
"indivs" : "0"
}
},
{
"#attributes" : {
"org_name" : "Alabama Power",
"total" : "15000",
"pacs" : "10000",
"indivs" : "5000"
}
},
... with 10 "#attributes" objects in the "contributor" array.
What I need to do is query this whole collection to find each cand_name object that includes a certain org_name, which I'm already uncertain of how to do (since every time I've tried to query with a string it replaces the spaces in my string with %20).
But then I need to display a table with all the cand_name objects that included that org_name with the total, pacs, and indivs numbers that correspond to that cand_name & org_name.
To be super clear here I'm trying to make a table that displays every politician that a company has given money to (and how much).
So through all this I'm looking in multiple levels of each object and need to display data from all those levels together in one table. I may just be overthinking this, but it seems like it's going to be a complicated query...
Help?
Figured this out! Ended up working with the backend guy on our project and he did it all on backend.
I could create a big query, and turn it into a view. Let's call it DBA_VIEW.
db.DBA_VIEW.find()
I'm using noSQLbooster to interact with mongodb and I'm trying to insert the result of this view into another collection.
I don't want to "right click > export" because I need to do this via noSQLbooster itself.
I've seen some querie sthat can do the trick, but, as a SQL SERVER dba, I think I can't get the logic behind, let's say, this one below:
db.full_set.find({date:"20120105"}).forEach(function(doc){
db.subset.insert(doc);
});
how can I use such approach to do my taks?
I just need the result of that view from a collection, to be inserted in another collection, then after this we are going to export the data into a .json file or even a .TXT.
You can design the query in the following way so that the output is directly inserted in a new collection('subset' in this example) without iterating through the result set.
db.full_set.aggregate([
{
$match:{
"date":"20120105"
}
},
{
$out:"subset"
}
])
If 'full_set' has the following documents:
{
"_id" : ObjectId("5d423675bd542251420b6b8e"),
"date" : "20130105",
"name" : "Mechanic1"
}
{
"_id" : ObjectId("5d423675bd542251420b6b8f"),
"date" : "20120105",
"name" : "Mechanic2"
}
{
"_id" : ObjectId("5d423675bd542251420b6b90"),
"date" : "20120105",
"name" : "Mechanic3"
}
With the above query, the 'subset' collection would be having the following documents:
{
"_id" : ObjectId("5d423675bd542251420b6b8f"),
"date" : "20120105",
"name" : "Mechanic2"
}
{
"_id" : ObjectId("5d423675bd542251420b6b90"),
"date" : "20120105",
"name" : "Mechanic3"
}
I am trying to remove the duplicate values from a deeply nested array. I've put the structure of the database down below. I want to compare the location of the steps with eachother and check for duplicates. I was thinking about using db.collection.aggregate, but it becomes a problem when trying to search through all steps since { $unwind: '$mapbox.routes.legs.0.steps' } requires a specific index for the steps as far as i know.
"mapboxRoute" : {
"routes" : [
{
"distance" : 105375,
"duration" : 8261.3,
"weight" : 11365.5,
"weight_name" : "routability",
"geometry" : "iv||H_{f^w#b#AFDZHb#DTBL?B#LN`ALx#BPA#WPEBc#X[PIFADFb#T|AHd#DZL~##DF\\Hd#DVFVBPDL?BBL#DBFJb#FV?#BHDL#FKBa#`#MJx#y##FKBa#`#MJi#b#WN]ROLSPWkAFS#s#Mg#Lf#Ar#GRVjAIHKJ_#b#INEFI^CHMPA#]\\IFa#\\s#l#MJMLIHe#b#_#^w#j#KFEBk#d#EDEDEBEBEBKJKHEBMLIHEDQDQLGFMHTQGFMHq#d#e#^GFg#b#ABQNCBIFWRQNm#h#QNa#\\ONGF?FAZBJv#vDd#xBd#fBj#hA`A`Cf#lAz#xBd#r#Z\\PRE\\CXCPB`A?r#A|#EdAR?DqABmDC]Ge#Me#m#yA}#wBiBeEo#uAg#cBMa#oAgGAKOU{AnAIFKJNRNMnAeABJNt#BNb#pBb#tB#BH\\ZhADF\\p#FN`A`Cf#lAHTFLDNb#dALRV^BBVXWYVZRPLHHDHDHDJCRCLAPG~#UNGLEDCRGPGJEl#UJEREBAVA\\BLBHF##PPHJJJNPBDFLBBL^Qc#BBL`#DJBDHPDPHNDJHPFJ#BBDPRPRNNRPBBHFNPDJP\\BDNf##D`BlHHTBLP^T^BBRVFFDBVLj#VLF~#b#FBGCHDJDB#ZJJF`#PTJNJZN^ZJHVVRTFJRVr#bAHJf#v#DFDF#BJL`#n#l#~#RXT^T\\f#t#FH##LRLRjAjB`#r#r#hA~AhCVj#kD_Gr#hA~AhCVj#Zl#BFXj#`#z#Xp#N^HTXx#FPVz#Vv#Tt##Fd#xAPn#Pn##FNp#Px#DRJ`#TfATfAb#xCRrAHj#T|AXhBXtBFb#Hp#Lr#f#`DBVBPl#tE#Fr#|Fu#eG#Fr#~FLjAVpCBJb#vDNhA?DHl#Fh#?J?\\#`#?\\?VA\\?#?\\AR?FAJEh#Ef#UjB[nCK|#KjACPEd#QnBYdDC\\CVALO|APkBALO~AEf#ABEj#CLETA#IVCDCFGHGHEBOLA#QHGBIBKBAAS?E?MEGCKGMKAAMOKOAEK[CIG]EQ?MCa#?C#i#?GFYG`#?GFYD]DMDMBGJUDIDCRSLGHETEBAb#A##pAHp#Hb#D~APt#LtAVhANTDhFbBxHfCZJXJJBPFb#L~#Vj#PvAl#lA`#hAj#XRNLZVFDVXdAjAeAkAdAjAVXPR##RNRNb#ZHFLFTLPHNHB#THTHJBFBRDVFR#V#R#T#D#HAb#?NAH?HA`#Ia#H`#I|#O~#OTE\\GLATCLCB?H?NAL?V?JAJBTBRDH#VHZHRFl#Rt#Vp#TdA^t#TPFp#Rx#TzBp#pBl#qBm#pBl#lBj#F#l#TbFfBXHzGpBfD`Ab#LrCl#`B^J#PDTFHB`DbAdDdAl#Rl#RTF\\L~#Xr#TF#hB`#~#T|#PhATp#LXDl#FnALoAMnALR#~#DvAHdADd#BzFHlLJhV`#\\#B?zLLJ#L?X?V#~BBnKPbCDbHJpBD#?p##jBBnCDxABrBDpBDzGLxA?xFBN?n#?H?r##r##s#Ar##h##d##f##F?j#Ah#A^A^AR?f#Cv#Cd#ALALANAv#Ib#EPAFAp#Kx#Kh#IRCRE`#GVEp#M`#Ga#F`#G`#ITEFA`#Ov#W\\Mh#Qr#Wn#SpCkAp#Yx#]fBu#r#Yt#[t#[l#WNEJE^On#U`#OJE#ALEdBq#RITKd#Q|#c#fAi#HEqAn#fAi#HEbAg#d#Wd#Sv#a#jC}AjAq#TOp#]~#e#rCyAZQ|CwAhFaC`EmBvFiC|CwADC`Aa#JElAi#ZO|#a#fBq#|Am#dA]tAe#bBi#DA~DiA_EhA~DiAj#Or#StBk#bAY\\KHCr#YLEPILEBA~Ao#DAp#YfAe#`Bq#BAl#Yj#WfD}AxDgBjB{#LG|As#hEoBLGLGPINIa#RPINIx#a#tCwApDgBjDeBDC^Sf#YJGJGnBgAhF}CnDuBLIf#]d#[FCf#a#n#g#`#[NQ|#_AhAmAFKj#y#V]NUp#gA`#q##Cf#y#d#}#e#|#d#}#n#gALWTg#Rg#BEZs#Rg#HQxBgFdB}DfBcEdGiNBEL]N]\\w#Xq#JWRg##Ex#kBz#kBPc#z#kBJUJULW#C\\m#`AcB?AlAkBmAlB?AlAkBh#{#\\e#r#cAj#y#\\e#PWfBcC^g#PWfAyAZa#zAsB|B}C~#oAvC}DBEnAwArA}AdBoBDGXY\\]lBuBzA}AfCkCbBcBxD{Dp#q#DEpEsErBuBsBtBrBuBh#i#~CcD`DaDb#c#dAgARSv#w#tEyElAmAjAmAfBgBnAoATWLMBCPQzB}BzB}BhEkEr#s#rC{CNOpBuB~CyCpAmA`#e#bFuFRYlAcB`A{AZg#Ve#s#lAZg#Ve#h#cAb#y#dAsBhGsLz#cBj#iA`CwEvF}KXk#Zm#bAsBdAqBzBqELShCgFTg#Xg#Tc#~ByE~AcDdEkI`EgIrDoHJUd#_AtAoCtAqC`#w#a#v#`#w#FMb#k#l#{#Za#f#}#JSx#wALU`#o#FIPSFGLKJEJCLAD?F#LBB?FDJFB#DFJJBDDFFPBBDPFXDn##h#?DIl#KZJ[KZCHEHe#x#EHg#r#iBhCIHC#C?C?GAKBIHCJCPAB?H#H?DBH#BFH##DBHNJ\\Lp#HZH`##FLd##HNd##Bj#lANPDLf#rAJ\\BFHVbBtFL\\M]L\\J^dE~M`#rAfB|Fx#hCHVL\\j#dBZ~#J\\DLHb#EDABAFCH?F?PBJ#DDD?#FB##FAB?FEL^#DJVLPNTVv#HVNTj#`AXf#NLLL][NLLLf#f#RRXXhChCjHzGz#v#xJbJFHFFr#n#LTPP`AbA`#b##?JHHH##JJJL^\\v#n#XV\\\\LLn#t#VXLPd#n#b#t#DHf#fAFLP`#Rj#h#|APf##F`#z#CF?DBMCF?DAH#F?B#HBHHF#BF?D?Dl#F\\Hl#DPP~#Jj#Nt#DP#H^vBz#~ETpAJh#Lr#Ll#Rr#Rn#BFRh#Rd#N^LVd#`AZp#DFf#p#g#q#f#p#b#n#NT`#\\l#h#PLjLlJfHfFBBPLJHhAz#r#h#rCxBtDlCzAfARN##LD`A^JDB#PBdAPRDH#r#Br#BHANAr#CPABAZE[DZElC_#|Dc#PAFAB?J?F?BF#BBD#BD###H?FEFIBKlCl#BBxAj#B#TLd#VHF^XNL\\VLLBBZZ^`#nBrBl#p#hBlBJHuBwBhBlBJHrBfBBBh#j#l#n#LJx#t#^\\rApAzDvDbKzJxCrCdAdADFDDZb#Zd#TZ?#T\\HLNVx#z#JLCL?F#J#HDH#DFD#?H?DA#CFGLHd#X\\PB#JDKEJDJDb#LFBfB^~A\\lDz#^HfAT\\Jr#Pv#Pj#NNDAP#P#BBJ##JHF#BAD?FIBCDM#OH#lCb#H#LB~FhAh#JTDRD?H?BBJ?#DH?#FFD#?X?B#v##dAAeA#dA?N#vA?D#f#?^#\\NzJDvC#DD|CLrGT|K?P#L?J#XBPDLDNGHABCNAF#F?FBHDJDBB?B#FAHE#EBE#G#O?AAIEOJSDKBG#CEJBG#CJOBEBCHIRWJMNOBELOTY#AZa#BCr#q#|#}#LKJIVUZUROHGBCn#]HANEBANGDAb#Gt#Mh#I`Ba#lCo#RETGtA[rA[sAZrA[#ATGHCb#MZIB?\\Kb#Kf#Mv#U~Aa#FCDANE`FkAfEcAVGhK}BdK}BxCq#vCo#r#OzBi#hAWPERGz#U#JBFDFFB#?B?BAG#B?BABAFI#I#C?K?CAK?AGKGEI?Y_Ba#gCUuAa#{Ci#yDg#yD_A}G{#mGCOE]AOCY?CAg#A[?EBm##GFk#BSBO#EFYJe#jCkKBQ#IAa#?j##IAa#AWI_#}B}FAA}AcE_BcECEGQKYy#{BEMUo#Yy#AEEQQw#Qy#CIQw#Qw#CKI_#I]ACr#o#d#[VUHKDIZe#lAqBDGDG`#q#rAiBt#cAfA{AJMt#s#v#s#w#r#v#s#BCLONSHMIYHKHX^i##CDMLORYXa#VYLILIFCZMf#MDARGBCLINMLILG\\Qx#a#nAe#jAa#LEp#Q|#WDAfA[B?dAa#iA`#B?dAa#v#[l#UDCj#Yz#e#d#WBAn#m#n#k#\\[x#y#VWJM`#m#FId#{#dAkBJQ#CJGHGRCFA^AJ?XCNCXGRERMHCFGXUNMOLNMHGFMHSLWBEFSHWFU#SD_##MCa#AOCKGYGS?GGe#CQ?M?m#Ao#DgAF}C?G#y##ICYCc#GUWiAG[?AF\\G[?AEc#Gm#Ca#CUAGGQAAMQIOGIECOEa#MAAKGGECEIQEMEKEUGQ?COw#QeAGYIe#AGAIGi#Fh#Gi#CUEg#ASE}#G{#I_BGoAEu#?ICc#?WAC?W?k#Am#?c#?a#?CCg#Eo#CUSeBSaBGk#CUACCQI_#Yy#[_AM[h#zA[_AM[]_AAAQYYi#KQKQCCGWI_#Me#Qu#Qu#a#kA]cACIy#iC?AIQWo#AC[c#a#m#mAcBiA_BIMACGOEKAGGSEQDPEQW{AG]AUEY?E?O?W?[?Y?W?O?CAMESCKKUUm#ACYk#g#aAQ]O[IOQOCAg#WSMRLSMCAGIGKAAEOK[Oe#Sm#Og#qBsGMa#MUOWKOEKM]ACCOEWAEAc#AG?[?wA?s#AGCc#SqAOkBAGW{DO{CA]CcC?Q#y##WDyA?IGzB#WDyA?I#c#AUCw#?AeAeGOo#Oq#Uc#Ue#sB{CA_#?GDk#B_#^cFDc#AECUAGGEMKUCG?BqA#{#?G?oB#uA?_#?e#?KAkBCuCASSyHGwDZpNSyHGwDKyIC{AAoF?aF?GBiDBgAHmDD{#R_F#KVmENwCPsC#IVwCLmAZ}BTgBf#qDXmBBODQ#CH#HCFIDM#MAG?CCKACCEGCBUCTBUDU`#gDd#mCPaA\\_Bf#aCb#qBfBgH#GRw#F[H]DY^kBDYLs#V{AHa#P_BVqBFy#ReCXaDHeBDo#DsADiA#KDgCBq#?[?cA?g#?f#?g#?eBAiA?YCgBAICu#HAdBUTE^Ex#AxAE^AzAGnDC|ACbAApCE~BExBCxBAF?xCK`DEbIM#?dFF|GH|LNbA#fJNdJNl##l##bEN|AHnAHD?jBP~Fn#B?dCT`AJr#D{Fg#dCT`AJr#DL#pAFtA#rAC#?VADA^CTAJAF?NC\\EJAb#ETCBAFAh#KrAWf#KlAa#t#UlB_AHEdBgAhAs#j#]VQb#YHEDCf#SnA_#lCy#mCx#lCy#jCy#hN}D`K}ClC}#bO{EhEyA`#O~Cw#pA[lA[#?xBm#NE`A_#ZMTKlAq##AdDmC#Al#_##Ar#[NGLGj#EH?B#BJ##DDBDB?HBHCHG#CBGDO?CERDO?C?O?AAOGMGGEEG}C?A?_##eK?}D?cA#UJoDJ{ARoCTsA\\sBt#eDj#qBjAyCx#_BrQe]pA}BWW_#EIDu#hAOLYJsJZa#C]IqBgAaAcAg#q#kBmD{#yAc#k#aLfKwG|FyGlG_AdAxEvMxGfKlArA|DvDr#d#~#\\rAJfC^TsADURoABMVgAXoABMj#qBDMf#mA\\}#x#_Bh#cArB{DtLeUpA}B#Ab#aAbCuEp#iAR]S\\R]|F}KNWbAmBFM|#mB#AFW\\qABIZ}ADWJkABUPsBDmDC_AA_#ASUsLc#qPAu#OcECu#S_CI}#CYC[c#sDIu#CYUiBThBUiBSgBCUAIAKIk#w#qGGg#E[{A_LMy#S_BMy#Mo#Qy#Ig#Uk#GSUo#]u#DQ?K?G?QEOEGCE?AEAIEA?K#A#GDMYQ]EIDHEIAA[a#EGIK_#g#KMY[s#u#AA]]CCe#g#{BaCkAmA_BeBq#q#m#q#qAwAaCiCEEo#q#GIIEIGSICAOECAOC?E#EAG?CAKCGCCCAEAG#E#ABFEE#ABCDAFA#?L?H#D#BBD#BGREPGNENGNCBKLOPQTWVc#d#A#cArAeAtAEDk#x#s#bAcArAaAtAA#ILk#t#s#~#[c#IMo#sAe#}#MULTMUUe#CEIUGOEWCMAKC[AM?Q?[?W?GBa#De#DODQFUBEHOLUV]#Ad#c#LMvA}A\\a#NOTWDE|F_FBC`#]a#\\`#]NMPOHGjAeAjAeAjC_CdA}#FGpEmDRQ~AiAfAw#bAi#bAk#HEZO\\OBA|#a#l#SLGx#W#?h#OTGx#QB?|#QPCl#I|#Kd#GXE~#I~#KNAn#I|#IRCj#Gn#GD?`BQpBUqBTpBUpBUxBUzBWdBShAMZCrBWr#Cb#AhACJ#P?T?R?pBF^#vBNf#DLBvAVv#LXDp#PvA^^H|A`#\\HzBl#bCp#XHx#Jp#Hl#HXDZ#u#GXDZ#fADb##V#P#P?D#fO\\pUh#vADjIRN#d#HfBZvAFp#HH#VFLBHBPFHBHFPLPJ^^BBFHLNLPj#dAfAvBb#z###LRMSLRFLDBPPBB`#VTFXJB?hAL\\BHJLHFLBFBFBP?P?V?BFLCt#AFKbBAXOlBAFKr#Ip#Kt#?DERUnAG\\Kf#UnAQ~#sAnHEVmB_Aa#YOUESAO?M?IHo#N_AFa#Hk#Jm#MCUtASnAEXIf#?^?NBNBLDJHLf#\\lAv#^TCLLm#mB_Aa#YOUESAO?M?IHo#N_AFa#Hk#Jm#MCUtASnAEXIf#?^?NBNBLDJHLf#\\lAv#^TCLI^a#vCAFGv#SdB?DKjAEj#AT?BG~#A\\AP?PAPAVAd#E~#Av#Ad#AlB?fA?TBnD?BFfBBlB?LBlC?PBlB#t#?\\?z#?dA?D?d#?PAT?\\Cn#APGz#AJGl#CNJ}#Gl#CNGb#EXG\\Ml#ADQv#Od#ENKVGNM^GHYn#MZKT_#z#IR_#bAGTSt#Or#CPG\\G\\CTE`#CPEj#CTCp#ALCd#?PA^AV?P?d#?F?XBd##d##TVbEv#~LBTCUBT#TTdDRzC^fGv#jLrCvc#d#hHv#rLlAhR\\jFJxADl#KDA#EHABCHAD?J?H?D?H#BBH#BDH#?HFH?HC#ADGBCBG#I#CCL#I#C#IAG?C?MZMZILCdDu#hCk#hAk#RIxGcDBAzH{DrHuDJEFCjFkCnAm#^Q|Ae#BAfBg#^GnASBA|AOtAG|EOlM_#xCItHSTA|GSx#Cn#AHA`#CTCF?#H#FBFB#GIBFB###D##AB?DEDM#KJ?`#Ap#A#?dAEhAE#?zAET?dACB?v#Cz#Cb#A~HUtJYb#DJ#NB`#HZFDB^J`#Lj#PtA^`#L`#FRDR?P#R?e#AP#R?NAr#GREXGr#KRE|#Kj#AR?B?ZFVDD#j#X#B`#d#JLLTNXHPDLNb#Lj#FXJr#XpBR~AVjBFd#VvBHp#LdALnAHz#RjBLnAMoALnABTR|BFn#HdAd#bG?Dh#fEZbChAjGr#xD~AtIF\\#JBDHJFJDJD#LF#?H?L?NAJ?VGl#Mp#QfAWTIb#Q#?ZGZEB?^Ac##B?^AX?D?PBTDJ#DBRFl#VLDxAj#NFPFVFTFZHLDzAVv#NXDb##l#B|AFjCFpCFbBBZ#nB#V?N?R?R?F?Hn#Qo#F?Hn#PvATdBj#~D\\~BD\\PjAtAvJHf##H#HBFBF#DLVFJHJLL#BDBNHVDD#D?H?F?B?JCNEPKHCJELG#?NALAM#LAD?JBB#HDNFHFDBFHDFHR#B|#vB~#xBlE|KpBhFp#bBFRRh#Nh#Jd#Jb##FFr#BX?L#b#?^?HCn#Cz#]COOAoAQGcBFKEGM?k#xB#N#?z##nANN\\BCj#ADQpCRwCADQpCg#tHIpAGfAMbCEfAEx#MlCItBE`AAl#EnAGrDMvFG|HCpC?~K?bF?ZLbR?\\#T?VY~IA`AChAA~##|#HjABb#BJV~AW_BV~ARfANz##LBj#Fx#FdAD|AHjCBz#Bt#JvCHfCXzIRvFPlFBhANbDLlCNtC^jIRvEBZH~A#TNdC^pGV`EJfBf#dIs#mLJfBf#fIl#bIb#jF`#bFD\\r#jIBVf#dF#Hb#bEf#xEx#|Ht#jHPlB#PHrABh##ZHlBNzCJxBFtAFtANfDBp#Bj#B\\Ft##JJt#?BNr#BNFTJ^BBXr#P^#Bd#~#LTMULTLTHPTn#F\\Lz#Lz##FJ~#J~##HHx#Bf#DhA?P#d##~##|#A`A?dD#rDAr#?T?BAVARAh#Ch#G^EXCFGXCHM\\Pg#CHM\\KVCBQXILCBQNMH_#TMBg#HA?[A_#GMA]G[EA?cACe#AS#Q#]HKDYJ]LUHc#Ze#Zy#t#C#uDpDONQNA#SNGF_#D[AMA#u#A]A]Ck#FCDCJQDW?YWfADCJQDW?YPMDE`#[JIdAo#JGv#e#LIt#e#DCf#U~#a#p#Yd#SBAv#YVIBAd#OLEz#WLEh#Ov#Wf#MhA[NCFCHCn#Qd#KFCm#Nd#KFCPGNE^Kb#Q`#MfAa#|Ai#t#YbE_BnFsBHCnAg#lAg#RIpCgA#Ad#Od#Q~#[z#[TGRGj#Oh#OFAv#OtBc#^G|#Q}#P|#Q~#SDAx#WPGfA]b#O\\OZMZOLEBARIjAg#nAk#rB{#f#UNGFCDCl#YdAg#JGNKRM\\SJI`#_#^]^]HGTSURTSTSFGr#c#b#YDETUBCb#e#DEPW^i#`#k#BCHMPWDIBANQH?#?LHHNJRUTeA~AmBnCqAtAuBfBaDfCmAn#gFjBiDt#i#`#[aASmAEYFCBEBI#IAKAICEEEEAG#EDCFCH?H#JBFDFDBDADXRlAZ`Ah#a#hDu#fFkBlAo#`DgCtBgBpAuAlBoCdA_BTULGBAb#QVK\\K#GBo##S?CBQBUBQFc#Gb#Fc#BIF]FUL[Xm#|AqDl#wAHQJY\\}#Vq#HS#Ec#g#YYOSIIMOWYOOeAoAm#u#ACQWGIYe#ACIOEKACMUYw#]gACGGQFPGQSm#OYYg#ACm#q#CA_#[YUGCk#YGCUEe#GO?m#CiEGu#CM?E?EOEU?S#QFgC?IFyAJcD#S#o#Bk#DO?ANIHEJAK#JAZLP##?HGDAB#TN~#\\fCv#vBn#x#Vt#VDhC#b#DtADfD#bAOb#Wf#GJq#s#y#q#{#a#{#MqIOKc#HoDT{GD{ADQVOLAZLP#PIDMf#}GHs#BY#CBW#GJ]BML_#DKJOLSLOBEHABAJCPEBAp#Ol#MDCFCLQ?ADK#SCO?E[qDQiBKiAGi#IiACUL~AIiACUCO{AaQo#iGCSAKCi##U?[#[Dc#\\aDtAyMXuCHy##YNsB\\yF?S#QGIEGIIAAuAk#YKSKwAm#iAg#IE[I}DkAgBg#AASKIEMGCCaB_B`B~AaB_B}A{As#s#GIg#q#EIWg#]o#Q]?CG]ACIMCAOKWQCA_#IQCG?AI?CCCEEE?AS#_##c#B{#H{#F_#Li#`#kAZaARq#?CDIfAeEFSb#mBHe#Jm#Fm#FaA#IDmB#q##i##YAX#Y#iATc]?GBw##IBm#F{##KDWHu##CFa#F]FYJe#La#FSBILa#BER_#rAiCZi#bCoEzAoC#CtA}BtF}JZk#`A}At#kAXc#PQMa#a#uA_EoNQe#O_#IWCEi#kACEe#y#d#x#e#y#}B}DAEM_#AEG]G[CKCYASAO?M?S#]?GBWBQBUDQNq#LWjAeCHQzAqCFIlF{JJSrAkCJ[b#sATq#T}#T{#DSToAFc#c#fCDSToAFc#PqADy#NyCDs##_A?o#?e#M{SEuHGuHCsGEkG?EAo#EaIEqJC}DC}DIoKAq#Cc#EwAK}BCSIoAKqACUi#eF{A{NAEsAeMuAcMGi#Fh#Gi#K_A]{CEc#UwBg#qEg#qEUyBW}BIo#Gq#OmAsBwRu#cHu#uG[iCaA^o#^eQ|N{GxFu#p#e#f#a#f#iGjI]Zk#VSJMDKLKRIVKRONkElEiBxBuBlB}EbFa#j#]v#Sx#Gl#IpCMDGHEVC`#MlEAv#At#AzE#f#BNDRNPBqJRmIHqCFm#Ry#\\w#`#k#|EcFtBmBhByBjEmENOJSHWJSJMLERKj#W\\[hGkI`#g#d#g#t#q#zGyFdQ}Nn#_#`A_#~#]FCXQd#YvBmAFEvEsCPK~BwAVU\\W#APOb#_#hEkF`KgM~AoB|AoB}AnB~AqBBEFG`BsB~AqBkAmC_E}H[o#Sc#K]?CAIAK#G#Q#G#GFWHg##A^kB\\eBBOVoAZaBDOpAuGpAwG?CDQv#aEv#aE#ETiAWnA#ETiAVqAH_#VwABGJa#T{#NYBE#Cf#kAPc#DGFE#?DAB?B#FADGDGBK?K#G#KFKrA{AJMHGZW\\SDAVMJC\\KDAxEaAlFiAVGXMHABFBBB?D#B?BADEBG^KvMmCXIh#O\\OFCFEZO^S\\SyAv#ZO^S\\Sp#e#h#g#f#g#DGl#s#n#}#BGBALUPYd#_ABGn#oABCR_#HMFMXe#n#iAJQ^s#O]Sa#IQEI]o#Yk#MUKOGKMOKMMKk#e#m#g#AAYSUSTRUSWS]WAAWW[Y_#c#Y[CC_#g#[e#CC[g#[g#AAUc#Yk#GMWi#Ym#Qa#EGQUIKCGIU_#cAg#wAEMSo#So#Uq#?CTt#Uq#?Cm#sBK]W{#]oAIa#K_#S}#U{#GYWqAG]i#kC]eBGWi#iDEUEUIi#a#_CMq#CQOaASmAW_BG_#YyB[yBK_AOsAS_BEe#WoCIcAIgARjCIcAIgAOoBi#qHe#cHa#wFAKKyAAOIeACa#Ec#Gy#Cc#OqBSeCEs#AIAiACgA?[Ac#Ae#CeAAs#?E?y##sA?q#?MB_AC~#BaADeA#SFgADk#?I#YBe#?O?O#a#?IA_#A]?CA[C]AQCc#?CCQAU}#TKDg#PG#s#Rk#LMDc#H]Hk#NKBODC?u#RGB}#T|#U}#TODMBe#LoCp#kD|#I#MBMBI?E?K#K?c#?w#GKAmBWsCi#aAIIAYGe#OGCCAECGE?ACICEACGEG?GBCBA#CD?DABAH?D#B#JBF?JCNE`#If#EVK`#Sn#ADKTQ^\\u#KTS^IREDEHORCBURQPA#STSVg#h#oArAA#a#b#a#b#]^[Zy#z#e#d#CDAHAJEECBONYXA#_#^MLGHCLAHAJ?B#L#R#PCRCNEHMFC#cANbAOcANeAPwAV",
"legs" : [
{
"distance" : 105336.1,
"duration" : 8259.5,
"steps" : [
{
"distance" : 132.5,
"duration" : 50,
"geometry" : "iv||H_{f^w#b#??AFDZ??H`#?#DT??BL???B#LN`A??Lx#??BP",
"name" : "Mariaplaats",
"ref" : null,
"destinations" : null,
"exits" : null,
"driving_side" : "right",
"mode" : "driving",
"maneuver" : {
"location" : [
5.117934,
52.089493
]
Does someone know how I can compare the locations of the steps?
At the end I stopped making a seperate file for connecting with mongodb and cleaning the database and started using the already existing API to create a call. In this call I looped through the steps in the database and mapped the location to a key. After that I check if that key already existed and pushed that index to a duplicate array.
Then I proceeded to loop through the duplicate list and spliced the duplicate entries from the list with steps. After that I ran the following function to update the entry: await routeSchema.updateOne({ _id: route._id }, { $set: route });
I have the following document
{
"_id" : ObjectId("5464e68481f8252e74f6e0ef"),
"message" : "Hello World!",
"timestamp" : ISODate("2014-11-13T17:12:36.547Z"),
"sender" : "D3EkLv8vatX3xfCGE",
"receiver" : [
{
"id" : "YzhZchz4AwCAd3q2R",
"seen" : false
},
{
"id" : "sm2W28EKYmHz29Aoj",
"seen" : false
}
],
"saved" : false
}
That's the basic structure. Now I want to get all the documents that have the current user's ID. The id can be in the sender field or one of the object in the receiver array. This works fine:
db.messages.find({ sender: "D3EkLv8vatX3xfCGE" })
But the following query doesn't work on the Meteor Mongo instance but does so in Mongo 2.6:
db.messages.find({ receiver: {id: "YzhZchz4AwCAd3q2R"} })
Is there any way I can get this to work. Also, the above query works on Minimongo but doesn't work on Meteor's bundled mongo(meteor mongo) which is currently at v2.4.9.
On mongo shell this query seems to work:
db.messages.find({ "receiver.id": "YzhZchz4AwCAd3q2R"} )
You can find all of the documents were a particular user is a receiver using receiver.id in your selector like so:
Messages.find({'receiver.id': 'YzhZchz4AwCAd3q2R'})
If you wanted to find all documents where a particular user was either a receiver or a sender you could do this:
var id = 'YzhZchz4AwCAd3q2R';
Messages.find({$or: [{'receiver.id': id}, {sender: id}]});
I asked several times and nobody gives me proper answer. So in Firebase, is this the proper data structure?
{
"users" : {
"-JNNJ-0ErS6kX5AFkfM3" : {
"userUid" : "simplelogin:66",
"userId" : "66",
"email" : "fd2#sdsa.cz"
}
"accounts" : {
"-JLXe5iaH-TLSBu0RJqp" : {
"currency" : "-JLXe--zoxk1DdKa9mAT",
"description" : "account1",
"name" : "account1"
},
"-JNJdqZouwAfEzmCSHTO" : {
"description" : "asdasd",
"name" : "dsad"
},
"-JLgcjINbZni6luTuPSY" : {
"currency" : "-JLXe--zoxk1DdKa9mAT",
"description" : "fefef",
"name" : "bkkjsdds"
}
},
"categories" : {
"-JLgd4W8COP6zOlhNdq9" : {
"color" : "#c55353",
"account" : "-JLXe5iaH-TLSBu0RJqp",
"description" : "fds",
"name" : "dsfdsfds"
}
},
"records" : {
"-JNNK2hnJ99dZqRmfsjs" : {
"date" : "2005-09-28T10:48",
"amount" : 123,
"description" : "description",
"category" : "-JLgd4W8COP6zOlhNdq9"
}
}
},
}
If it's hard to read, there is explanation.
I have a user with a key. User has accounts > every account has categories (every category has a key from an account) > every category has records (every record has a key from a category.
So for example that one record (I am describing parameters):
record's key: -JNNK2hnJ99dZqRmfsjs
records belongs to category with the key: -JLgd4W8COP6zOlhNdq9
People from Firebase unfortunately didn't help me at all and I don't understand their single tutorial.
Is this the proper way to do so? I just want to have data for each user (nobody else can't see another user's data).
EDIT:
Is this correct? I know that post. But I still don't understand it.
In real world is this proper way?
users
-JNNK2hnJ99dZqRmfsjs (key of user1 for example)
name
id
etc
accounts
-JLgd4W8COP6zOlhNdq9 (key of some account)
name
description
-KFTf6W8COP6zOlhNdq9 (key of user - account belongs to user and account has users reference - the key)
Is this correct?
EDIT2:
Look at this:
awesome.firebaseio-demo.com
Anant has beautiful tree:
users
user1
name
user2
name
How did he do it? I thought I can work only with keys.
Firebase blog post - Denormalizing Your Data is Normal helps you with proper data structure.
The second question ("nobody else can't see another user's data) is about security rules - you have to determine who can read data.