mongo コンソールで非常に単純な map/reduce を実行しました。
var mapState = function () {
emit(this.state, 1);
};
var sumState = function (keyState, valuesCount) {
return Array.sum(valuesCount);
};
db.FooBar.mapReduce(
mapState,
sumState,
{out: "state_counts"}
);
var sc = {};
db.state_counts.find(
{_id: {$exists: true}}).forEach(
function(o){
sc[o._id]=o.value;
}
);
> sc
{
"ak" : 29,
"al" : 5832,
"ar" : 2798,
...
}
> db.state_counts.find().limit(3)
{ "_id" : "ak", "value" : 29 }
{ "_id" : "al", "value" : 5832 }
{ "_id" : "ar", "value" : 2798 }
ここまでは順調ですね。「sc」オブジェクトには、予想される州の略語とカウントがあります。mongoose を使用して "sc" オブジェクトに相当するものに変換する前に、state_counts からデータを取得しようとすると、奇妙なことが起こります。
#!/usr/bin/env node
mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/thedb");
var schema = new mongoose.Schema({});
schema.collection = 'state_counts';
console.log(schema.collection);
var cur = mongoose.model(schema.collection, schema);
cur.find({}).exec(
function(err, data) {
if (err) {
console.log(err);
mongoose.disconnect();
}
console.log(data);
mongoose.disconnect();
}
);
$ ./test.js
state_counts
[ { value: 29 },
{value: 5832 },
{ value: 2798 },
...
]
これは私にとって驚くべきことです。Mongoose を使用しているときに、スクリプトに「_id」値が表示されないのはなぜですか?