Как я могу получить массив всех идентификаторов doc в MongoDB? Мне нужен только набор идентификаторов, но не содержимое документа.Как я могу получить все идентификаторы doc в MongoDB?
ответ
Вы можете сделать это в оболочке Монго, вызвав map
с курсором, как это:
var a = db.c.find({}, {_id:1}).map(function(item){ return item._id; })
Результатом является то, что a
является массивом только в _id
значений.
Способ работы в узле аналогичен.
(Это драйвер 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 и он запускается внутри базы данных до возврата курсора.
Другой способ сделать это на Монго консоли может быть:
var arr=[]
db.c.find({},{_id:1}).forEach(function(doc){arr.push(doc._id)})
printjson(arr)
Надежда, что помогает !!!
Спасибо !!!
Один из способов - просто использовать 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
})
не будет отличать лишнюю нагрузку на сервере esp, когда идентификаторы уже уникальны? – comiventor
@comiventor это возможно ... но я полагаю, что OP только хочет сделать это на небольшом наборе данных, так что, вероятно, это не имеет большого значения. С другой стороны, это позволяет избежать циклического завершения всех результатов для их возврата в массив на клиенте. – whitfin
это может/приведет к ошибке, например '' 'Команда с ошибкой 17217:« слишком большая, 16mb cap »на сервере''' на большом наборе данных – Watt
Я также задавался вопросом, как сделать это с водителем MongoDB Node.js, как @ user2793120. Кто-то еще сказал, что он должен перебирать результаты с., Который казался мне очень неэффективным. Я использовал 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()
Сортировка фаза является необязательным. Совпадение также, если вы хотите, чтобы все коллекции были лишены. Если вы console.log результат, вы увидите что-то вроде:
[ { _id: null, ids: [ '56e05a832f3caaf218b57a90', '56e05a832f3caaf218b57a91', '56e05a832f3caaf218b57a92' ] } ]
Затем просто использовать содержимое результата [0] .ids где-то в другом месте.
Ключевая часть здесь $group section.Вы должны определить значение null для _id (иначе произойдет слияние агрегации) и создать новое поле массива со всеми _ids. Если вы не возражаете против дублирования идентификаторов (в соответствии с вашими критериями поиска, используемыми в фазе $ match, и если вы группируете поле, отличное от _id, которое также имеет другой документ _id), вы можете использовать $push вместо $addToSet.
Работает и на меня. – treecoder
- 1. Как я могу получить все идентификаторы узлов xml через xquery?
- 2. Как я могу получить все идентификаторы musicbrainz, связанные с художником?
- 3. Как я могу получить все идентификаторы объектов из контекста Spring?
- 4. Как получить все идентификаторы процессов?
- 5. Как я могу удалить все ObjectId в базе данных (mongodb)?
- 6. Как я могу получить все имена полей коллекции MongoDB?
- 7. Получить все идентификаторы в CouchDB
- 8. jqGrid получить все идентификаторы
- 9. как получить все почтовые идентификаторы в WordPress
- 10. Как я могу получить данные MongoDB в Textboxes через javadriver?
- 11. Как получить все ключи в коллекции Mongodb?
- 12. Как я могу сопоставить идентификаторы?
- 13. получить все идентификаторы из строки
- 14. Получить все идентификаторы из списка
- 15. Как я могу собрать все идентификаторы скрытых элементов?
- 16. MongoDB - как я могу увидеть все в коллекции, используя оболочку?
- 17. Уникальные идентификаторы в MongoDB
- 18. перебирать все документы -> _ идентификаторы в MongoDB, PHP
- 19. Magento получить все родительские идентификаторы
- 20. Как получить все идентификаторы из вставленной таблицы
- 21. Как получить все идентификаторы из формы?
- 22. Как я могу получить все идентификаторы из столбца базы данных в один массив?
- 23. Как я могу динамически получить все мои приложения для facebook
- 24. C# Как я могу получить доступные идентификаторы кодовой страницы?
- 25. Как я могу получить имена и идентификаторы этого объекта?
- 26. Как я могу получить упорядоченные идентификаторы с разбивкой на страницы?
- 27. Как я могу проверить идентификаторы сообщений Facebook
- 28. mongodb query embedded doc key как дата
- 29. Как я могу запросить документы в mongodb
- 30. Как я могу получить все строки данных?
'db.c.find ({}, {_ id: 1});' должен делать это – Sammaye
то, что find() возвращено, является курсором, я все равно не видел все идентификаторы (но не документы , как cursor.toArray() делает) из возвращаемого курсора. – user2793120
Поскольку MongoDB общается в BSON, я не думаю, что вы хотите, не исчерпывая курсор, а затем отфильтровывая значения. – Sammaye