2014-02-07 53 views
1
use MongoDB; 
my $dbClient = MongoDB::MongoClient->new(); 
my $db = $dbClient->get_database('exp_new'); 
my $rsvnCollection = $db->get_collection('reservations'); 
my $rsvnDB = $rsvnCollection->find({parent_id => {'$exists' => 1}}); 
my $explanation = $rsvnDB->explain; 
my $num = $rsvnDB->count; 

的解釋是給我的MongoDB :: Cursor對象在Perl返回重複記錄

$VAR1 = { 
      'nscannedObjectsAllPlans' => 45824, 
      'n' => 33459, 

和$ NUM返回相同。

,我試圖訪問這樣

while (my $record = $rsvnDB->next) { 

這是給我重複記錄的記錄,而環比的不是在解釋返回的記錄數量更多的運行。

我在做什麼有什麼不對嗎?任何想法爲什麼它給重複的記錄?

感謝 拉吉

取樣記錄:

> db.reservations.findOne({parent_id: {$exists : 1}}) 
{ 
    "_id" : 428, 
    "created_user" : "george", 
    "status" : NumberLong(2), 
    "topologies" : [ ], 
    "parent_id" : 428, 
    "end_time" : ISODate("2012-08-25T01:45:00Z"), 
    "reserved_ports" : { 
     "bangalore" : [ 
      "eth 12/1", 
      "eth 12/10", 
     ] 
    }, 
    "repeatInfo" : { 
     "recurrEndType" : "Occurrences", 
     "recurrType" : "Daily", 
     "recurrValue" : NumberLong(9) 
    }, 
    "created_time" : ISODate("2012-08-24T00:16:34Z"), 
    "name" : "George", 
    "start_time" : ISODate("2012-08-24T16:20:01Z"), 
    "deleted" : "0", 
    "task" : "ACTIVATION", 
    "modified" : "0", 
    "devices" : [ 
     "bangalore" 
    ], 
    "updated_time" : ISODate("2012-08-30T01:44:55Z"), 
    "ports" : [ ], 
    "updated_user" : "George", 
    "reserved_devices" : [ 
     "bangalore" 
    ], 
    "topology_details" : [ ] 
} 
> 
+0

你的文件是什麼樣的。你可以用集合中的幾個示例文檔進行編輯。也可以嘗試從mongo shell進行比較。但是你在做什麼很簡單。 –

回答

0

不聽,因爲我任何答覆,而我沉思了parent_id領域,可能更包含DBRef對象後。默認情況下,Perl MongoDB驅動程序expands those references並從數據庫中提取文檔。這就是爲什麼你會看到更多的文檔被拖動,並且可能無助於你的數據可能有循環引用。

將您的調用更改爲MongoClient,通過禁用此行爲來解決此問題。

my $dbClient = MongoDB::MongoClient->new(inflate_dbref => 0); 

給自己一個音符提高一個JIRA有這個默認關閉,並在此情況下,離開這個有些確實遇到問題,所以可以幫助他們。

所以現在我們有一些樣本數據,我們可以看到這個不同。

如果您在收藏中包含樣本文檔,這對於在這裏查看的各位人員來說會非常清楚。在提問時請記住一點。

你提到的行爲很可能是由上面提到的某種形式的遞歸引起的。由於這是而不是有問題的驅動程序,我們正在尋找您的代碼來查看問題。

沒有什麼錯已發佈的代碼,但它主要是達不到你的循環中做什麼,而你是迭代光標

是合理的結論作出,考慮到你的初始查詢查找具有parent_id的文檔是您打算在循環中使用parent_id。你的樣本數據也顯示_idparent_id實際上是相同的。

所以,如果你有任何代碼以下parent_id那麼這無疑是爲什麼你看到你的結果。

+0

我已更新樣本記錄的問題。讓你知道沒有DBRef對象。我嘗試了你的建議,它並沒有幫助我。 記錄中沒有循環引用。 – Raj

+0

唯一的解釋是數據正在以某種方式遞歸。在循環遊標時你幹什麼? –

+0

@Raj你真的需要看看編輯現在看起來很清楚必須發生什麼 –