Как я могу получить все идентификаторы doc в MongoDB?
Как я могу получить массив всех идентификаторов doc в MongoDB? Мне нужен только набор идентификаторов, но не содержимое документа.
Ответы
Ответ 1
Вы можете сделать это в оболочке Mongo, вызвав map
на курсор следующим образом:
var a = db.c.find({}, {_id:1}).map(function(item){ return item._id; })
В результате a
представляет собой массив только значений _id
.
То, как оно работает в Node, похоже.
(Это драйвер MongoDB Node v2.2
и Node v6.7.0
)
db.collection('...')
.find(...)
.project( {_id: 1} )
.map(x => x._id)
.toArray();
Не забудьте поставить map
до toArray
, так как этот map
НЕ является функцией JavaScript map
, но он предоставлен MongoDB и запускается в базе данных до курсор возвращается.
Ответ 2
Один из способов - просто использовать API-интерфейс 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
API:
var ids = db.distinct.distinct('_id', {}, {});
который просто дает вам массив идентификаторов:
[
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
})
Ответ 3
Другим способом сделать это на консоли mongo может быть:
var arr=[]
db.c.find({},{_id:1}).forEach(function(doc){arr.push(doc._id)})
printjson(arr)
Надеюсь, что это поможет!!!
Спасибо!!!
Ответ 4
Мне также было интересно, как это сделать с драйвером MongoDB Node.JS, например, @user2793120. Кто-то еще сказал, что он должен перебирать результаты с., Который казался мне очень неэффективным. Вместо этого я использовал агрегацию MongoDB:
myCollection.aggregate([
{$match: {ANY SEARCHING CRITERIA FOLLOWING $match RULES} },
{$sort: {ANY SORTING CRITERIA, FOLLOWING $sort RULES}},
{$group: {_id:null, ids: {$addToSet: "$_id"}}}
]).exec()
Фаза сортировки является необязательной. Совпадение также, если вы хотите, чтобы все коллекционные _ids. Если вы выполните console.log результат, вы увидите что-то вроде:
[ { _id: null, ids: [ '56e05a832f3caaf218b57a90', '56e05a832f3caaf218b57a91', '56e05a832f3caaf218b57a92' ] } ]
Затем просто используйте содержимое результата [0].id где-то еще.
Ключевой частью здесь является $group section. Вы должны определить значение null для _id (иначе произойдет слияние агрегации) и создать новое поле массива со всеми _ids. Если вы не возражаете против дублирования идентификаторов (в соответствии с вашими критериями поиска, используемыми в фазе $match, и если вы группируете поле, отличное от _id, которое также имеет другой документ _id), вы можете использовать $push вместо $addToSet.