MongoDB ですべてのドキュメント ID の配列を取得するにはどうすればよいですか? ID のセットのみが必要ですが、ドキュメントの内容は必要ありません。
8 に答える
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
前 に置くことを忘れないでください。toArray
map
map
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
}
ただし、実際のdistinct
APIを使用するさらに優れた方法があります。
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
})
また、@ 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を使用できます。
mongo コンソールでこれを行う別の方法は次のとおりです。
var arr=[]
db.c.find({},{_id:1}).forEach(function(doc){arr.push(doc._id)})
printjson(arr)
それが役立つことを願っています!!!
ありがとう!!!