如何在node.js中实现Mongodb游标的映射功能(node-mondodb-native)

Sre*_*M B 1 mongodb node.js node-mongodb-native

我正在尝试在NodeJS中实现以下MongoDB查询

db.tvseries.find({}).map(function(doc){
    var userHasSubscribed = false;

    doc.followers && doc.followers.forEach(function(follower) {
            if(follower.$id == "abc") {
                userHasSubscribed = true;
            }
        });


    var followers = doc.followers && doc.followers.map(function(follower) {
            var followerObj;
            db[follower.$ref].find({
                    "_id" : follower.$id
                }).map(function(userObj) {
                        followerObj = userObj;
                    });
             return followerObj;
        });

    return {
            "id": doc.name,
            "userHasSubscribed": userHasSubscribed,
            "followers": followers || []
        };
})
Run Code Online (Sandbox Code Playgroud)

以下是数据库

用户集合

{
     "id": ObjectId("abc"),
     "name": "abc_name"
},
{
     "id": ObjectId("def"),
     "name": "def_name"
},
{
     "id": ObjectId("ijk"),
     "name": "ijk_name"
}
Run Code Online (Sandbox Code Playgroud)

电视连续剧集

{
     "id": ObjectId("123"),
     "name": "123_name",
     "followers": [
        {
            "$ref": "users",
            "$id": ObjectId("abc"),
        },
        {
            "$ref": "users",
            "$id": ObjectId("def"),
        }
     ]
},
{
     "id": ObjectId("456"),
     "name": "456_name",
     "followers": [
         {
            "$ref": "users",
            "$id": ObjectId("ijk"),
        },
     ]
},
{
     "id": ObjectId("789"),
     "name": "789_name"
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何在node-mongodb-native插件的帮助下在NodeJS中执行上述MongoDB查询。

我尝试了以下代码,但随后出现TypeError:undefined不是 .map中的函数

var collection = db.collection('users');
collection.find({}).map(function(doc) {
   console.log(doc);
});
Run Code Online (Sandbox Code Playgroud)

如何在NodeJS中执行.map函数?

提前致谢

mid*_*dev 5

我知道我已经很晚了,但我已经通过在 Google 上搜索相同的问题到达了这里。最后,我无法使用mapfunction 来做到这一点,但使用forEach却成功了。

使用 ES6 和 StandardJS 的示例。

  let ids = []
  let PublicationId = ObjectID(id)
  feeds_collection
    .find({PublicationId})
    .project({ _id: 1 })
    .forEach((feed) => {
      ids.push(feed._id)
    }, () => done(ids))
Run Code Online (Sandbox Code Playgroud)


bam*_*mse 5

我为此苦了一段时间。我发现通过.toArray()map功能起作用后添加。

您甚至可以跳过map,仅添加.toArray()即可获取所有文档字段。

  const accounts = await _db
    .collection('accounts')
    .find()
    .map(v => v._id) // leaving this out gets you all the fields
    .toArray();

  console.log(accounts); // [{_id: xxx}, {_id: xxx} ...]
Run Code Online (Sandbox Code Playgroud)

请注意,为了map正常工作,所使用的函数必须返回某些内容-您的示例仅console.log返回s而不返回值。


forEach解决方案有效,但我真的很想map工作。