草庐IT

node.js - 如何在mongodb中组合对象数组结果

coder 2023-11-03 原文

如何将匹配文档的子文档合并为一个并将其作为对象数组返回?我试过 $group 但似乎不起作用。

我的查询(在这种情况下返回对象数组有两个)

User.find({
      'business_details.business_location': {
        $near: coords,
        $maxDistance: maxDistance
      },
      'deal_details.deals_expired_date': {
        $gte: new Date()
      }
    }, {
      'deal_details': 1
    }).limit(limit).exec(function(err, locations) {
      if (err) {
        return res.status(500).json(err)
      }
console.log(locations) 

console.log(locations) 结果 //给我下面的结果

[{
  _id: 55 c0b8c62fd875a93c8ff7ea, // first document 
  deal_details: [{
    deals_location: '101.6833,3.1333',
    deals_price: 12.12 // 1st deal 
  }, {
    deals_location: '101.6833,3.1333',
    deals_price: 34.3 // 2nd deal 
  }],
  business_details: {}
}, {
  _id: 55 a79898e0268bc40e62cd3a, // second document 
  deal_details: [{
    deals_location: '101.6833,3.1333',
    deals_price: 12.12 // 3rd deal 
  }, {
    deals_location: '101.6833,3.1333',
    deals_price: 34.78 // 4th deal 
  }, {
    deals_location: '101.6833,3.1333',
    deals_price: 34.32 // 5th deal
  }],
  business_details: {}
}]

我想做的是将这两个 deal_details 字段组合在一起,并将其作为对象数组返回。它将在一个对象数组中包含 5 个交易,而不是两个单独的对象数组。

我已经尝试在我的后端 (nodejs) 中使用 concat 或 push 来做到这一点,但是当有超过 2 个匹配文档时,我无法将它们连接在一起,有什么方法可以合并所有匹配文档并返回它作为一个?就像我上面提到的那样?

最佳答案

您可能在这里缺少的是 $unwind管道阶段,这是您通常用来“反规范化”数组内容的阶段,特别是当您的分组操作打算跨查询结果中的文档工作时:

User.aggregate(
    [
        // Your basic query conditions
        { "$match": {
            "business_details.business_location": {
                "$near": coords,
                "$maxDistance": maxDistance
            },
            "deal_details.deals_expired_date": {
            "$gte": new Date()
        }},

        // Limit query results here
        { "$limit": limit },

        // Unwind the array
        { "$unwind": "$deal_details" },

        // Group on the common location
        { "$group": {
             "_id": "$deal_details.deals_location",
             "prices": {
                 "$push": "$deal_details.deals_price"
             }
        }}
    ],
    function(err,results) {
        if (err) throw err;
        console.log(JSON.stringify(results,undefined,2));
    }
);

输出如下:

{
    "_id": "101.6833,3.1333",
    "prices": [
        12.12,
        34.3,
        12.12,
        34.78,
        34.32
    ]
}

取决于实际匹配分组的文档数量。

或者,您可能想查看 $geoNear管道阶段,它提供了更多的控制,尤其是在处理数组中的内容时。

另请注意,对于数组中的“位置”数据,此处仅考虑“最近”的结果,而不是数组内容的“全部”。所以数组中的其他项目可能实际上并不“靠近”查询点。这更多是一种设计考虑,因为您执行的任何查询操作都需要考虑这一点。

关于node.js - 如何在mongodb中组合对象数组结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31822044/

有关node.js - 如何在mongodb中组合对象数组结果的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  3. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  4. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  5. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  6. 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%

  7. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  8. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  9. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  10. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

随机推荐