[英]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.