2017-08-07 4 views
1

J'utilise CouchDB avec CouchBase Lite sur Android. Je voudrais reproduire la DB sur mon appareil, pour cela je voudrais utiliser the filtered replication.Code de fonction de carte comme réplicateur de filtre sur CouchDB

J'ai écrit et script qui fonctionne parfaitement lorsque je l'exécute sur Futon et tous les documents avec les requeriments que j'ai écrit sont affichés. Mon problème est que si j'utilise le code comme filtre Cela ne fonctionne pas sur mon appareil mobile et je ne reçois pas les documents avec les exigences dont j'ai besoin.

C'est la fonction qui fonctionne bien sur Futon (désolé pour le défilement)

function(doc) { 
if (doc.ismaster != true && 
    (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=360) && 
    ((((doc.type=='field_order') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=10))) || 
    (((doc.type=='consumption_report') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=10))) || 
    (((doc.type=='production_order') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24))<=10))) || 
    (((doc.type=='work_report') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=40))) || 
    (((doc.type=='pallet') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=10))) || 
    (((doc.type=='shipment') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=10))) || 
    (((doc.type=='sowing_report') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=10))))){ 
    emit([doc.type], doc); 
} 

}

Et c'est le filtre de réplication qui ne fonctionne pas avec le même code:

"filters": { 
    "666": "function(doc, req) { 
    if (doc.ismaster != true && 
     (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=360) && 
     ((((doc.type=='field_order') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=10))) || 
      (((doc.type=='consumption_report') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=10))) || 
      (((doc.type=='production_order') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24))<=10))) || 
      (((doc.type=='work_report') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=40))) || 
      (((doc.type=='pallet') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=10))) || 
      (((doc.type=='shipment') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=10))) || 
      (((doc.type=='sowing_report') && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime())/(1000 * 3600 * 24)) <=10))))) 
    return true;}", 

Qu'est-ce que je fais mal?

+0

Utilisez-vous la passerelle de synchronisation couchbase? –

+0

désolé mais je n'utilise pas CouchBase, j'utilise couchDB – JoCuTo

Répondre

0

Couchbase Lite ne prend actuellement pas en charge les filtres CouchDB. C'est un problème complexe. Pour plus d'informations, voir this documentation et this GitHub issue.

+0

merci @Hod vous pensez à résoudre le support des filtres dans les futures versions de couchbase lite; 1.5 peut-être? – JoCuTo