0

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」値が表示されないのはなぜですか?

4

1 に答える 1

1

_idスキーマを定義しておらず、 mongoose は mongodb にスキーマを追加することがすべてであるため、表示されません。そのため、完全に空のスキーマが与えられた場合、mongoose はおそらく_idObjectId(mongodb の慣例) であると想定し、mongodb のデータをその型にキャストすると失敗すると、データが与えられた場合は常にそうであるように、mongoose は値を省略します。これは理にかなっています。マングースの仕事の大部分は、一貫したスキーマを強制することです。これで「修正」されます。

var schema = new mongoose.Schema({_id: String, value: Number});
于 2013-10-18T04:07:53.107 に答える