Node.js 猫鼬_id";在使用map/reduce创建的集合中消失
我在mongo控制台中完成了一个非常简单的map/reduceNode.js 猫鼬_id";在使用map/reduce创建的集合中消失,node.js,mongodb,mongoose,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_count
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_计数中提取数据时,会出现奇怪的情况
#!/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”值
\u id
未显示,因为您尚未定义架构,而mongoose的全部任务是向mongodb添加架构。因此,给定一个完全空的模式,mongoose可能会假设\u id
将是ObjectId
类型(这是mongodb的常规),当将mongodb中的数据强制转换为该类型时失败,因为它总是会在给定数据的情况下这样做,mongoose会忽略该值,考虑到猫鼬的大部分工作是执行一致的模式,这是有道理的。这将“修复”它
是的。我期待着对象id的“默认”行为出现。
var schema = new mongoose.Schema({_id: String, value: Number});