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)
我也想知道如何使用 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。
| 归档时间: |
|
| 查看次数: |
27968 次 |
| 最近记录: |