簡體   English   中英

流星不服從Mongo存在

[英]Meteor disobeys $exists from Mongo

我有兩個收藏,一個叫做鄉村,另一個叫做城市。 我遍歷每個村庄,並將其與我的其他收藏進行比較,以找到最近的城市。 然后,將一個田地城市:cityName添加到我的村庄集合中。 這會讓我知道每個村庄都在哪個城市附近。

var cursor = Villages.find({city: {$exists: 0}});

cursor.forEach(function(village) {
    var lat = district.loc.latitude;
    var long = district.loc.longitude;
    var city = Cities.find({ loc: {$near: [lat,long],
                                   $maxDistance: 2}},
                           {fields: {name: 1, _id: 0}},
                           {limit: 1});

    city.forEach(function(nearestCity) {
        Villages.update({name: village.name}, 
                        {$set: {city: nearestCity.name}});
    });

});

我第一次運行它時,所有這些都起作用。 從我的清單的頂部開始,它經歷了一段時間,隨着時間的推移,我的村庄收藏增加了大約40,000個城市田地。 我的筆記本電腦完成了計算機操作,連接丟失,我嘗試再次運行它。 而不是從其中斷處開始,它再次從集合的頂部開始,無論這些條目中是否存在city字段。

我跟蹤了不同的值,但它仍然可以正常運行,只是沒有正確的文檔。 當我從第一個文檔之一中刪除該字段時,光標的數量增加了1,直到它從列表中滑下並通過了它。 然后,計數再次下降。

我的問題是:為什么返回正確數量文檔的游標會在錯誤的文檔上運行?

問題是我的文檔沒有唯一的名稱。 將其更改為基於_id值進行更新_id我的問題。 該應用程序找到了(例如)溫布利CA,發現它最接近Grande Prairie CA,但是隨后將該信息應用於集合決定為我顯示的任何溫布利GB或AU。 這意味着一切正常,但仍會找到沒有城市價值的相同文檔,因為它只是將城市價值提供給同名兄弟姐妹。 我最后的劇本是

var cursor = Villages.find({city: {$exists: 0}});

cursor.forEach(function(village) {
    var lat = village.loc.latitude;
    var long = village.loc.longitude;
    var city = Cities.find({loc: {$near: [lat,long], $maxDistance: 2}}, 
                            {fields: {name: 1, _id: 0}} 
                            ).fetch();

    if(city.length == 0) //If no cities are nearby, I let it pick itself
    {
        city = [{name: village.name}];
    }

    Villages.update({_id: village._id}, {$set: {city: city[0].name}});

});

我使用的是find().fetch()而不是僅僅使用find() 這使我可以更輕松地訪問單個文檔及其值。 這使我可以訪問_id字段,該字段用於引用適當的文檔並解決了我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM