如何在MongoDB中获取包含所有文档ids的数组?我只需要一组I,而不需要文档内容。
发布于 2013-09-18 21:56:04
您可以在Mongo shell中通过对光标调用map
来完成此操作,如下所示:
var a = db.c.find({}, {_id:1}).map(function(item){ return item._id; })
结果是a
是一个只包含_id
值的数组。
它在Node中的工作方式类似。
(这是MongoDB节点驱动程序v2.2
和节点v6.7.0
)
db.collection('...')
.find(...)
.project( {_id: 1} )
.map(x => x._id)
.toArray();
请记住将map
放在 toArray
之前,因为此map
不是JavaScript map
函数,但它是由MongoDB提供的函数,并且它在返回游标之前在数据库中运行。
发布于 2015-02-08 02:13:43
一种方法是简单地使用runCommand应用编程接口。
db.runCommand ( { distinct: "distinct", key: "_id" } )
它给出了类似这样的结果:
{
"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
}
但是,使用实际的distinct
应用程序接口还有一种更好的方法:
var ids = db.distinct.distinct('_id', {}, {});
它只给出了一个ids数组:
[
ObjectId("54cfcf93e2b8994c25077924"),
ObjectId("54d672d819f899c704b21ef4"),
ObjectId("54d6732319f899c704b21ef5"),
ObjectId("54d6732319f899c704b21ef6"),
ObjectId("54d6732319f899c704b21ef7"),
ObjectId("54d6732319f899c704b21ef8"),
ObjectId("54d6732319f899c704b21ef9")
]
不确定第一个版本,但Node.js驱动程序(我看到您提到您想要使用它)肯定支持后者。它看起来像这样:
db.collection('c').distinct('_id', {}, {}, function (err, result) {
// result is your array of ids
})
发布于 2016-03-10 17:14:10
我也想知道如何使用@ Node.JS 2793120这样的MongoDB用户驱动程序来做到这一点。其他人说他应该用.each迭代结果,这在我看来效率很低。我改用了MongoDB's aggregation:
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()
排序阶段是可选的。如果您想要所有集合的_ids,也可以使用match。如果您console.log结果,您将看到类似以下内容:
[ { _id: null, ids: [ '56e05a832f3caaf218b57a90', '56e05a832f3caaf218b57a91', '56e05a832f3caaf218b57a92' ] } ]
然后在其他地方使用result.ids的内容。
这里的关键部分是$group section。您必须为_id定义一个空值(否则,聚合将崩溃),并创建一个包含所有_ids的新数组字段。如果您不介意If重复(根据$match阶段中使用的搜索条件,并假设您对_id之外的字段进行分组,该字段也具有另一个文档_id),则可以使用$push而不是$addToSet。
https://stackoverflow.com/questions/18881982
复制