mongoose“_id”在使用map / reduce创建的集合中消失

时间:2013-10-17 20:41:32

标签: node.js mongodb mongoose

我在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”对象中有预期的状态缩写和计数。当我尝试从state_counts中提取数据之前,使用mongoose将数据转换为等效的“sc”对象时,会出现奇怪。

#!/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”值?

1 个答案:

答案 0 :(得分:1)

_id尚未显示,因为您尚未定义架构,而猫鼬所有关于将架构添加到mongodb。因此,给定一个完全空的模式,mongoose可能假设_id将是ObjectId类型(这对于mongodb是常规的)并且当将mongodb中的数据转换为该类型时失败,因为它总是会给出你的数据,mongoose省略了值,这是有道理的,因为大多数猫鼬的工作是强制执行一致的架构。这将"修复"它

var schema = new mongoose.Schema({_id: String, value: Number});