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”对象中有预期的状态缩写和计数。当我尝试从 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 },
...
]

这让我很惊讶。为什么使用猫鼬时“_id”值没有出现在我的脚本中?

4

1 回答 1

1

_id没有出现,因为您还没有定义模式,而 mongoose 就是模式添加到 mongodb。因此,给定一个完全空的模式,mongoose 可能假设_id将是类型ObjectId(对于 mongodb 来说是常规的),并且当将 mongodb 中的数据转换为该类型时失败,因为它总是会根据您的数据,mongoose 省略该值,这是有道理的鉴于猫鼬的大部分工作是强制执行一致的模式。这将“修复”它。

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