如何获取MongoDB中的所有文档ID?

use*_*120 19 mongodb

如何在MongoDB中获取所有文档ID的数组?我只需要一组id而不是doc内容.

Joh*_*yHK 43

您可以通过调用map光标来在Mongo shell中执行此操作,如下所示:

var a = db.c.find({}, {_id:1}).map(function(item){ return item._id; })
Run Code Online (Sandbox Code Playgroud)

结果是a只是_id值的数组.

它在Node中的工作方式与此类似.

(这是MongoDB节点驱动程序v2.2和Node v6.7.0)

db.collection('...')
  .find(...)
  .project( {_id: 1} )
  .map(x => x._id)
  .toArray();
Run Code Online (Sandbox Code Playgroud)

记得放在map 之前, toArray因为这map不是JavaScript map函数,但它是MongoDB提供的函数,它在返回游标之前在数据库中运行.


whi*_*fin 10

一种方法是简单地使用runCommand API.

db.runCommand ( { distinct: "distinct", key: "_id" } )
Run Code Online (Sandbox Code Playgroud)

这给你这样的东西:

{
    "values" : [
        ObjectId("54cfcf93e2b8994c25077924"),
        ObjectId("54d672d819f899c704b21ef4"),
        ObjectId("54d6732319f899c704b21ef5"),
        ObjectId("54d6732319f899c704b21ef6"),
        ObjectId("54d6732319f899c704b21ef7"),
        ObjectId("54d6732319f899c704b21ef8"),
        ObjectId("54d6732319f899c704b21ef9")
    ],
    "stats" : {
        "n" : 7,
        "nscanned" : 7,
        "nscannedObjects" : 0,
        "timems" : 2,
        "cursor" : "DistinctCursor"
    },
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

但是,使用实际的distinctAPI 有一个更好的方法:

 var ids = db.distinct.distinct('_id', {}, {});
Run Code Online (Sandbox Code Playgroud)

它只是为您提供了一系列ID:

[
    ObjectId("54cfcf93e2b8994c25077924"),
    ObjectId("54d672d819f899c704b21ef4"),
    ObjectId("54d6732319f899c704b21ef5"),
    ObjectId("54d6732319f899c704b21ef6"),
    ObjectId("54d6732319f899c704b21ef7"),
    ObjectId("54d6732319f899c704b21ef8"),
    ObjectId("54d6732319f899c704b21ef9")
]
Run Code Online (Sandbox Code Playgroud)

不确定第一个版本,但Node.js驱动程序(我看到你提到你想使用)肯定支持后者.这看起来像这样:

db.collection('c').distinct('_id', {}, {}, function (err, result) {
    // result is your array of ids
})
Run Code Online (Sandbox Code Playgroud)

  • 在大型数据集上,这可能会/将导致类似``命令失败并出现错误17217:'distinct太大,16mb cap'on server''的错误 (2认同)

Luc*_*edo 5

我也想知道如何使用 MongoDB Node.JS 驱动程序来做到这一点,比如@user2793120。其他人说他应该用 .each 迭代结果,这对我来说效率很低。我改用了MongoDB 的聚合

    myCollection.aggregate([
            {$match: {ANY SEARCHING CRITERIA FOLLOWING $match'S RULES} },
            {$sort: {ANY SORTING CRITERIA, FOLLOWING $sort'S RULES}},
            {$group: {_id:null, ids: {$addToSet: "$_id"}}}
    ]).exec()
Run Code Online (Sandbox Code Playgroud)

排序阶段是可选的。如果您想要所有集合的 _id,也可以匹配一个。如果你 console.log 结果,你会看到类似的东西:

    [ { _id: null, ids: [ '56e05a832f3caaf218b57a90', '56e05a832f3caaf218b57a91', '56e05a832f3caaf218b57a92' ] } ]
Run Code Online (Sandbox Code Playgroud)

然后只需在其他地方使用 result[0].ids 的内容。

这里的关键部分是$group 部分。您必须为 _id 定义一个 null 值(否则聚合会崩溃),并使用所有 _id 创建一个新的数组字段。如果您不介意重复 id(根据您在 $match 阶段使用的搜索条件,并假设您正在对 _id 以外的字段进行分组,该字段也有另一个文档 _id),您可以使用$push而不是$addToSet