2017-09-24 3 views
0

Ich versuche, die Dokumente aus der db in einer Reihenfolge von den meisten Likes am wenigsten zu holen und ich laufe weiter in einen Fehler. Ich habe ein paar Dokumente mit likes von 1, 2 und 3 erstellt und die Reihenfolge, die zurückgegeben wird, ist 2, 3, 1. Es ist wirklich seltsam, denn wenn ich den Server zum ersten Mal starte, funktioniert es gut, aber ich habe das nach etwa 20 gefunden Während ich an meinem Projekt arbeitete (ohne den Code zu berühren, den ich posten wollte), wurde mir klar, dass die Dokumente nicht in der richtigen Reihenfolge zurückgegeben wurden. Könnte das ein Fehler in Meteor sein? Oder ist es ein Problem auf meiner Seite? Wie auch immer, hier ist der Code, in dem ich versuche, die Dokumente in Ordnung zu bringen.Mongo Sortierung nicht Daten in der Reihenfolge

renderNotesByLike.js

import React from "react"; 
import { Tracker } from "meteor/tracker"; 
import { Link, withRouter } from "react-router-dom" 

import { Notes } from "./../../methods/methods"; 

class RenderNotesByLike extends React.Component{ 
    constructor(props){ 
    super(props); 
    this.state = { 
     notes: [] 
    }; 
    } 
    renderNotes(notes){ 
    return notes.map((note) => { 
     return(
     <div key={note._id} className="note-list" onClick={() => {this.props.history.push(`/fullSize/${note._id}`)}}> 
      <div className="left inline"> 
      <p><strong>{note.title}</strong></p> 
      <span className="removeOnSmallDevice">{note.userEmail}</span> 
      </div> 
      <div className="right inline"> 
      <span>Subject: <strong>{note.subject}, {note.unit}</strong></span> 
      <br /> 
      <span className="removeOnSmallDevice">⬆ {note.likes.length} ⬇ {note.dislikes.length}</span> 
      </div> 
     </div> 
    ) 
    }) 
    } 
    componentDidMount() { 
    this.tracker = Tracker.autorun(() => { 
     Meteor.subscribe('notes'); 
     const notes = Notes.find({subject: this.props.subject}, {sort: {likes: -1}}).fetch(); 
     notes.map((note) => {console.log(note.likes.length)}) 
     this.setState({ notes }) 
    }); 
    } 
    componentWillReceiveProps(nextProps) { 
    this.tracker = Tracker.autorun(() => { 
     Meteor.subscribe('notes'); 
     const notes = Notes.find({subject: nextProps.subject}, {sort: {likes: -1}}).fetch(); 
     this.setState({ notes }); 
    }); 
    } 
    componentWillUnmount() { 
    this.tracker.stop() 
    } 
    render(){ 
    return(
     <div className="center"> 
     {this.renderNotes(this.state.notes)} 
     </div> 
    ) 
    } 
} 
export default withRouter(RenderNotesByLike); 

Die Veröffentlichung für notes ist ziemlich einfach:

Meteor.publish('notes', function() { 
    return Notes.find() 
}); 

ich erkennen, dass ein mögliches Problem, da würde ich alle Noten bin veröffentlichen, und ich habe um diejenigen zu veröffentlichen, die gefiltert werden sollen. Aber ich habe es genau so gemacht mit der CreatedAt Eigenschaft und das funktioniert ganz gut.

Beispieldaten

cloudinaryData: 
{data: {…}, status: 200, statusText: "OK", headers: {…}, config: {…}, …} 
createdAt: 
1506224240000 
description:"" 
dislikes:[] 
imageURL:["AImageURL.jpg"] 
likes:["[email protected]"] 
subject:"Food" 
title:"a" 
unit:"a" 
userEmail:"[email protected]" 
userId:"rSGkexdzzPnckiGbd" 
_id:"GPJa8qTZyDHPkpuYo" 
__proto__:Object 

Hinweise Schema:

"notes.insert"(noteInfo){ 
    noteInfo.imageURL.map((url) => { 
     const URLSchema = new SimpleSchema({ 
     imageURL:{ 
      type:String, 
      label:"Your image URL", 
      regEx: SimpleSchema.RegEx.Url 
     } 
     }).validate({ imageURL:url }) 
    }) 

    Notes.insert({ 
     title: noteInfo.title, 
     subject: noteInfo.subject, 
     description: noteInfo.description, 
     imageURL: noteInfo.imageURL, 
     userId: noteInfo.userId, 
     userEmail: noteInfo.userEmail, 
     unit: noteInfo.unit, 
     likes: [], 
     dislikes: [], 
     createdAt: noteInfo.createdAt, 
     cloudinaryData: noteInfo.cloudinaryData 
    }) 
    console.log("Note Inserted", noteInfo) 
    } 
+0

Können Sie Ihr 'Notes' Schema und Datenbeispiel zeigen? – Styx

+0

@Styx aktualisiert über –

Antwort

2

Sie Sortierung basierend auf einem Array, nicht die Länge des Arrays. {sort: {likes: -1}} wird Ihnen keine vorhersehbaren Ergebnisse liefern. Versuchen Sie, das abgerufene Array von Dokumenten explizit mit der Funktionvon underscore.js zu sortieren.

componentDidMount() { 
    this.tracker = Tracker.autorun(() => { 
    Meteor.subscribe('notes'); 
    let notes = Notes.find({subject: this.props.subject}).fetch(); 
    notes = _.sortBy(notes,(n) => { return n.likes.length}); 
    this.setState({ notes }) 
    }); 
} 
+0

Ich bin nicht wirklich vertraut mit sortBy(), gerade jetzt funktioniert es, aber es wird in umgekehrter Reihenfolge (am wenigsten zu Greates), wie müsste ich es ändern, um am größten zum kleinsten zu sein? –

+0

'return -n.likes.length' –

Verwandte Themen