繁体   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