2013-10-17 42 views
0

我做了一個非常簡單的地圖/減少蒙戈控制檯。貓鼬「_id」消失在與地圖創建的集合/減少

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中提取數據並將其轉換爲使用貓鼬的「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」值?

回答

1

_id沒有顯示出來,因爲您還沒有定義架構,並且貓鼬是全部關於將模式添加到mongodb中。因此給定一個完全空的模式,貓鼬可能假設_id的類型爲ObjectId(這對於mongodb是常規的),並且在將mongodb中的數據轉換爲該類型失敗時,因爲它總會給出您的數據,所以貓鼬省略了該值由於貓鼬的大部分工作是強制執行一致的模式,因此是合理的。這將「修復」它。

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

是的。我期待出現對象_id的「默認」行爲。 – lysdexia