27

MongoDB ですべてのドキュメント ID の配列を取得するにはどうすればよいですか? ID のセットのみが必要ですが、ドキュメントの内容は必要ありません。

4

8 に答える 8

63

map次のようにカーソルを呼び出して、Mongo シェルでこれを行うことができます。

var a = db.c.find({}, {_id:1}).map(function(item){ return item._id; })

結果は、値aだけの配列_idです。

Node での動作方法は似ています。

(これは MongoDB Node driverv2.2と Nodeですv6.7.0)

db.collection('...')
  .find(...)
  .project( {_id: 1} )
  .map(x => x._id)
  .toArray();

これは JavaScript関数ではありませんが、MongoDB によって提供されるものであり、カーソルが返される前にデータベース内で実行されるため、map に置くことを忘れないでください。toArraymapmap

于 2013-09-18T21:56:04.453 に答える
12

1 つの方法は、単純に runCommand API を使用することです。

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
}

ただし、実際のdistinctAPIを使用するさらに優れた方法があります。

 var ids = db.distinct.distinct('_id', {}, {});

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
})
于 2015-02-08T02:13:43.013 に答える
6

また、@ user2793120 のように、MongoDB Node.JS ドライバーでこれを行う方法も考えていました。他の誰かが、.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()

並べ替えフェーズはオプションです。すべてのコレクションの _id が必要な場合は、一致するものも同様です。結果を console.log にすると、次のように表示されます。

    [ { _id: null, ids: [ '56e05a832f3caaf218b57a90', '56e05a832f3caaf218b57a91', '56e05a832f3caaf218b57a92' ] } ]

次に、 result[0].ids の内容を別の場所で使用します。

ここで重要な部分は$group セクションです。_id に null の値を定義し (そうしないと、集計がクラッシュします)、すべての _id を含む新しい配列フィールドを作成する必要があります。ID が重複していてもかまわない場合 ($match フェーズで使用した検索基準に従い、別のドキュメント _id を持つ _id 以外のフィールドをグループ化すると仮定して)、$addToSetの代わりに$pushを使用できます。

于 2016-03-10T17:14:10.203 に答える
4

mongo コンソールでこれを行う別の方法は次のとおりです。

var arr=[]
db.c.find({},{_id:1}).forEach(function(doc){arr.push(doc._id)})
printjson(arr)

それが役立つことを願っています!!!

ありがとう!!!

于 2013-09-19T05:52:12.177 に答える