jjzjj

node.js - Mongoose $near 填充被忽略

coder 2023-11-05 原文

我希望有人能帮助我 - 我想用地理查询填充子文档以对它们进行排序:

我有这些模型(简化):

(很多文章):

   var articleSchema = mongoose.Schema({
      places: [{ type: mongoose.Schema.Types.ObjectId, ref: "places", required: false }],
      someData: { type: String, required: true },
})

(很多地方):

var placeSchema = mongoose.Schema({
   longitudelatitude: {
      type: { type: String, required: true },
      coordinates: [
       { type: Number, required: true }, //longitude 
       { type: Number, required: true }  //latitude 
       ]},
   someData: { type: String, required: true }
})

我的第一个查询仅查找 Position 附近的地点,效果很好:

getPlacesNearBy: function (lng, lat, skipNumber, limitNumber, callback) {
   Place.find({
     longitudelatitude: {
        $near: {
            $geometry: { type: "Point", coordinates: [lng, lat] },}}
        }, null, {skip: skipNumber, limit: limitNumber}, function (err, foundPlaces) {
            if (err)
                return callback(err, null);
            return callback(null, foundPlaces);
        })
    },

我找到靠近我的地方 - 我可以选择限制多少 - 我可以通过跳过重新加载更多

现在我想做类似的事情:

我想获取一篇文章 - 并填充存储的位置(您可以从中获取它们),然后我想按距离对位置进行排序,并可能跳过或限制响应

所以我尝试了:

getPlacesforArticle: function (articleId, lng, lat, skipNumber, limitNumber, callback) {
    var projection = null;
    Article.findById(articleId, {places: 1}).populate("places", projection, {
        longitudelatitude: {
            $near: {
                $geometry: { type: "Point", coordinates: [lng, lat] },
            }
        }
    }, {skip: skipNumber, limit: limitNumber}).exec(function (getError, foundArticle) {
        if (getError)
             return callback(getError, null);
        callback(null, foundArticle.places);
        });
    }
},

所以这个查询是有效的(没有抛出错误)但是它没有响应我想要的 - 我得到了位置但是它们是按数据库序列而不是按距离“排序”的 - 所以 $near 似乎被忽略了(没有这个查询测试带来相同的结果)但是当我过滤到其他一些工作正常的内容(比如 Name="test")时,限制也在工作,但我不能跳过这个响应的某些地方......

好吧,我希望有人能理解我并能帮助我 =)!

非常感谢!

最佳答案

所以我找到了解决问题的方法...

https://docs.mongodb.com/manual/reference/command/geoNear/

使用 db.aggregate 而不是 db.find!

在那里你可以定义一个单独的查询=)

关于node.js - Mongoose $near 填充被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44301806/

有关node.js - Mongoose $near 填充被忽略的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  4. c - mkmf 在编译 C 扩展时忽略子文件夹中的文件 - 2

    我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。

  5. Ruby - 如何在读取文件时跳过/忽略特定行? - 2

    在读取/解析文件(使用Ruby)时忽略某些行的最佳方法是什么?我正在尝试仅解析Cucumber.feature文件中的场景,并希望跳过不以Scenario/Given/When/Then/And/But开头的行。下面的代码有效,但它很荒谬,所以我正在寻找一个聪明的解决方案:)File.open(file).each_linedo|line|line.chomp!nextifline.empty?nextifline.include?"#"nextifline.include?"Feature"nextifline.include?"Inorder"nextifline.include?

  6. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  7. Ruby 正则表达式匹配逗号,但忽略括号中的逗号 - 2

    我正在尝试通过正则表达式拆分参数列表。这是一个带有我的参数列表的字符串:"a=b,c=3,d=[1,3,5,7],e,f=g"我想要的是:["a=b","c=3","d=[1,3,5,7]","e","f=g"]我试过先行,但Ruby不允许使用动态范围后行,所以这行不通:/(?如何让正则表达式忽略方括号中的所有内容? 最佳答案 也许这样的东西对你有用:str.scan(/(?:\[.*?\]|[^,])+/)编辑再三考虑。简单的非贪婪匹配器在某些嵌套括号的情况下会失败。 关于Ruby正则

  8. ruby - 如何用递增的值填充数组 Ruby - 2

    我正在尝试解决http://projecteuler.net/problem=1.我想创建一个方法,它接受一个整数,然后创建一个包含它前面的所有整数的数组,并将整数本身作为数组中的值。以下是我目前所拥有的。代码不起作用。defmake_array(num)numbers=Array.newnumcount=1numbers.eachdo|number|numbers 最佳答案 (1..num).to_a是您在Ruby中需要做的全部。1..num将创建一个Range对象,以1开始并以任意值num结束是。Range对象有to_a方法通过

  9. ruby-on-rails - RoR中是否有任何内置方法可以为整数填充零? - 2

    如果我想要“00001”而不是“1”,除了我自己写填零方法之外,有没有内置的方法可以帮助我为整数填零? 最佳答案 puts"%05d"%1#00001参见:String::%,Kernel::sprintf这是正在发生的事情。%左侧的"%05d"是C风格的格式说明符。%右边的变量就是要格式化的东西。格式说明符可以像这样解码:%-格式说明符的开头0-用前导零填充5-长度为5个字符d-被格式化的是一个整数如果你要格式化多个东西,你会把它们放在一个数组中:"%d-%s"%[1,"One"]#=>1-one

  10. ruby - 忽略 Jekyll 中的特定标签 - 2

    我正在使用Jekyll构建一个站点,我的代码中有一些看起来像{{}}(液体标签)的东西。我希望它在Jekyll完成生成网站后最终出现在输出html中,但Jekyll将其解释为其他任何标记。有没有办法让Jekyll只忽略这个标签的这个特定实例? 最佳答案 使用{%raw%}标签:{%raw%}{{...}}{%endraw%}此代码段将生成{{...}}。 关于ruby-忽略Jekyll中的特定标签,我们在StackOverflow上找到一个类似的问题: htt

随机推荐