简体   繁体   中英

how to nest mongodb queries through node.js?

I am having a collection of users of the type -

{
"_id" : ObjectId("56f60e4eea8af4670408483e"),
"twitterHandle" : "shrutip",
"firstName" : "Shruti",
"lastName" : "Patil",
"emailID" : "shrutip@gmail.com",
"password" : "91382451347786e9b8f2f3817b27a2adfec1880c",
"phoneNumber" : "98739458789",
"location" : "San Jose",
"birthYear" : 1992,
"birthMonth" : 1,
"birthDay" : 10,
"followers" : [
    "abhayp",
    "anupd",
    "lubdhal",
    "poojag",
    "prashantb",
    "pratiksanglikar",
    "shaileshyedge",
    "shrutip"
],
"following" : [
    "abhinavk",
    "anupd",
    "hiteshn",
    "lubdhal",
    "omkarn",
    "poojag",
    "pratiksanglikar",
    "shaileshyedge",
    "shrutip"
],
"tweets" : [
    {
        "tweet_id" : "3c50e98cf0c2298f40f98a013cd4a18a1443b7ac",
        "tweet_text" : "At BJP youth wing meet, seniors worry over #JNU controversy, and not #RamTemple.",
        "createdOn" : ISODate("2016-03-07T23:37:27Z"),
        "tags" : [
            "JNU",
            "RamTemple"
            ]
        }
    ]
}

I want to create feed (all tweets of the users the given user is following in ascending order of date) for any given user. I got the list of users which the given user is following, but I need to find the tweets of the found users. How do I do it in node.js? How to nest these queries?
What I've done so far is listed below -

var cursor = MongoDB.collection("users").find({
    "twitterHandle": twitterHandle
});
cursor.each(function(err, doc) {
    assert.equal(err, null);
    if (doc != null) {
        var followingCursor = MongoDB.collection("users").find( { twitterHandle: { $in: doc.following } } );
        followingCursor.each(function (err, following) {
            if(following != null) {
                feed.push(following.tweets);
            }
        });
        promise.resolve(feed);
    }
});

But somehow, the promise gets resolved before the second query executes. How do I ensure that all the iterations of followingCursor.each are executed before I return the promise?

Eventually I found out the answer myself.

if (doc != null) {
    var followingCursor = MongoDB.collection("users").find( { twitterHandle: { $in: doc.following } } );
    followingCursor.each(function (err, following) {
        if(following != null) {
            feed.push(following.tweets);
        }
    });
    promise.resolve(feed);
}

In the above code, promise should be resolved if the following != null condition fails. Apparently MongoDB driver returns null when the values in cursor end. The correct code is as following -

if (doc != null) {
        var followingCursor = MongoDB.collection("users").find( { twitterHandle: { $in: doc.following } } );
        followingCursor.each(function (err, following) {
            if(following != null) {
                feed = feed.concat(following.tweets);
            } else {
                promise.resolve(feed);
            }
        });
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM