我在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”值?
答案 0 :(得分:1)
_id
尚未显示,因为您尚未定义架构,而猫鼬所有关于将架构添加到mongodb。因此,给定一个完全空的模式,mongoose可能假设_id
将是ObjectId
类型(这对于mongodb是常规的)并且当将mongodb中的数据转换为该类型时失败,因为它总是会给出你的数据,mongoose省略了值,这是有道理的,因为大多数猫鼬的工作是强制执行一致的架构。这将"修复"它
var schema = new mongoose.Schema({_id: String, value: Number});