Как я могу получить все идентификаторы 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.