2016-04-27 5 views
0

Ich habe etwa 30.000 Dokumente in einer MongoDB-Sammlung. Und bei der Entwicklung eines node.js-Skripts stecken geblieben, um nur die Datensätze mit einem bestimmten String-Schlüssel-Wert-Paar abzurufen.nodejs und MongoDBs collection.find() antwortet nicht

diese Abfrage auf MongoDB-Server gibt mir die genauen Ergebnisse, die ich schon immer gesucht haben:

db.getCollection('posts').find({authorName: "Ashwin-kumar"}) 

Gibt mir etwa 33 Dokumente sofort. Ebenso habe ich etwa 40 Autoren mit unterschiedlichen Namen.

Hier ist mein node.js Skript Beiträge von author abrufen (Ja, es basiert auf Namen, eine Zeichenfolge, da es keine ID für diese Autoren ist :():

var fs = require('fs'), 
    request = require('request'), 
    async = require("async"), 
    assert = require('assert'); 
    _ = require('lodash'), 
    MongoClient = require('mongodb').MongoClient; 

var db, postsCollection, postCol; 

async.series([dbConnect, checkCollection, createMeta, dbClose], function(){ 
    console.log("Executed all calls in series."); 
    process.exit(0); 
}); 

function dbConnect(callback){ 
    MongoClient.connect("mongodb://localhost:27017/jPosts", function(pErr, pDb) { 
     if(pErr) { 
      console.dir(pDb); 
      return 0; 
     } 
     db = pDb; 
     callback(); 
    }); 
} 

function dbClose(callback){ 
    db.close(true, function (err) { 
     if (err) console.error(err); 
     else console.log("close complete"); 
     callback(); 
    }); 
} 

function checkCollection(callback) { 
    db.collection('posts', function(err, collection) {}); 
    postsCollection = db.collection('posts'); 
    postCol = db.collection('posts'); 
    callback(); 
} 

function createMeta(callback){ 
    var meta = []; 
    postsCollection.aggregate([ 
     { 
      $group : {_id : "$authorName"} 
     }]).toArray(function(err, result) { 
      assert.equal(err, null); 
      async.forEachLimit(result, 1, function(pPost, callback) { 
       getPosts(pPost._id, callback); 
      }, function(err) { 
       console.log(err); 
       callback(); 
      });     
     }); 
} 

function getPosts(pAuthor, callback){ 
    var cursor = postCol.find({ "authorName": pAuthor}); 
    cursor.toArray(function(err,items){ 
     if(err) 
      callback(err); 
      else 
      callback(null, items); 
     }); 
} 

Dies scheint nicht für mich zu arbeiten. cursor.toArray() tut nichts anderes als ewig warten. Ist es wegen der zu viele Felder in jedem Dokument?

ich die Zählung der Dokumente der Cursor geholt und es funktioniert gut zu bekommen versucht.

function getPosts(pAuthor, callback){ 
    var cursor = postCol.find({ "authourName": pAuthor}); 
    cursor.count().then(function(items_count) { 
     console.log(items_count); 
     callback(); 
    });   
} 

Ich habe auch die Methode .each des Cursors versucht, die abgerufenen Dokumente zu iterieren. Aber noch kein Glück.

function getPosts(pAuthor, callback){ 
    var cursor = postCol.find({ "authourName": pAuthor}); 
    cursor.each(function(err, doc) { 
     assert.equal(err, null); 
     if (doc != null) { 
      console.dir(doc); 
     } else { 
      console.log(err); 
     } 
    }); 
} 

Fehle ich hier etwas? Was kann noch getan werden, damit dies funktioniert? Gibt es Probleme mit der Art, wie ich Async verwende?

S.: Die Idee hier ist, den Dump abzufragen und die PDFs für Authours in der jPost-Sammlung zu generieren.

P. S 2: Hier ist ein Beispieldokument

{ 
    "_id" : ObjectId("571d36b55672f713fe346a66"), 
    "id" : 56517, 
    "authorName" : "Ashwin-kumar", 
    "comment_count" : 380, 
    "tagline" : "... Opinions you don't really need", 
    "vote_count" : 5152, 
    "exclusive" : null, 
    "post": [ 
    ], 
    "post_comments" : [ 
     //comment_count objects 
    ], 
    "date" : "2016-03-27" 
} 

(Ich habe Kürze & post_comments Teile Post weggelassen.)

Antwort

0

Haben Sie überprüfen, was der Wert von pAuthor in getPosts ist? Denn wenn Sie Aggregation tun, können Sie eine Sammlung von Objekten mit _id Feld (nicht authourName) erhalten, so sollten Sie tun:

// not sure why you need meta array, at least it's not used in the code you provided 
meta.push({ 
    author: pPost._id 
}); 
getPosts(pPost._id, callback); 
+0

Meta-Array anderes verwendet wird, in dem für eine andere Zweck. Und ja, die Aggregation Return-Liste der Autoren und Post-Count –

+0

Richtig, pPost._id ist, was ich in meinem tatsächlichen Code verwenden. Beim Aufräumen der gesamten Funktionen zum Posten hier habe ich pPost._id durch den authorName ersetzt. –

+0

Ah ok, welche Version von Async benutzt du? Da es im Dokument https://github.com/caolan/async kein forEachLimit gibt, verwende ich async.eachLimit für den gleichen Zweck. Die Version der Bibliothek ist jedoch wahrscheinlich nicht der Grund des Problems. –

1

try this:

var collection = db.collection("collection_name"); 
collection.find({authourName: "Ashwin-kumar"}).toArray(function (err,items) { 
    if (err) { 
     console.dir(err); 
    } else { 
     //do something with items array 
     console.dir(items); 
    } 
}); 
+0

wo "collection_name" ist der Name Ihrer Sammlung – SU15