【问题标题】:How to perform Greater than Operator in MongoDb Compass Querying inside inner object collection如何在内部对象集合内的 MongoDb Compass 查询中执行大于运算符
【发布时间】:2020-12-02 16:13:44
【问题描述】:

这是我在 Mongo DB Compass 中的 Json。我只是从每个集合中查询大于评级的产品。

注意:如果我使用 pageCount,它可以正常工作,因为它不在集合中。

{PageCount:{gte:2}} -- works.

如果有人匹配集合的内部数组集合,则会显示全部。

当我们执行以下查询时,如果索引中的任何一个大于 99,它会显示所有值。

{"ProductField.ProductDetailFields.ProductDetailInfo.ProductScore.Rating": {$exists:true,  $ne: null , $gte: 99}}

----- 如果我执行上述查询,我​​会得到这个 输出。

如何像 foreach 一样迭代并检查 MongoDB 查询中的条件

{
   "_id":{
      "$oid":"5fc73a7b3fb52d00166554b9"
   },
   "ProductField":{
      "PageCount":2,
      "ProductDetailFields":[
         {
            "PageNumber":1,
      
            "ProductDetailInfo":[
               {
                  "RowIndex":0,
                  "ProductScore":{
                     "Name":"Samsung",
                     "Rating":99
                  },
                 
               },
               {
                  "RowIndex":1,
                  "ProductScore":{
                     "Name":"Nokia",
                     "Rating":96
                  },
                  
               },
                {
                  "RowIndex":2,
                  "ProductScore":{
                     "Name":"Apple",
                     "Rating":80
                  },
                  
                   
               }

            ]
         }
      ]
   }  
},
{
   "_id":{
      "$oid":"5fc73a7b3fb52d0016655450"
   },
   "ProductField":{
      "PageCount":2,
      "ProductDetailFields":[
         {
            "PageNumber":1,
            "ProductDetailInfo":[
               {
                  "RowIndex":0,
                  "ProductScore":{
                     "Name":"Sony",
                     "Rating":93
                  }
               },
               {
                  "RowIndex":1,
                  "ProductScore":{
                     "Name":"OnePlus",
                     "Rating":93
                  }
               },
               {
                  "RowIndex":2,
                  "ProductScore":{
                     "Name":"BlackBerry",
                     "Rating":20
                  }
               }
            ]
         }
      ]
   }
}

@Misky 如何运行此查询执行:

在 Mongo Shell 中运行此查询时 - 没有 sql 客户端抛出以下错误。我们正在使用 3.4.9 https://www.nosqlclient.com/demo/

【问题讨论】:

  • 您希望从您的帖子中的该文档得到什么结果?顺便说一句{"yourLongThing": {$gte: 99}} 这已经足够了,因为任何大于 99 的数字都存在并且不为空 XD
  • 搜索将在多个文档上进行,因为在文档集合内考虑 2 个集合 - 每个文档 ProductDetailInfo 数组都有一个产品评级,我需要根据评级进行过滤。评级大于 99 的文档。如果您看到屏幕截图,我已经做了 gte:99,但它显示在值下方。如果它不在嵌套集合中,则 gte 作品
  • @Minsky 如果它按照你的方式工作,你可以把上面发布的 json 并尝试使用 gte 看看

标签: arrays mongodb mongodb-query aggregation-framework


【解决方案1】:

这和你的想法有点接近

db.collection.aggregate({
  $addFields: {
    "ProductField.ProductDetailFields": {
      $map: {
        "input": "$ProductField.ProductDetailFields",
        as: "pdf",
        in: {
          $filter: {
            input: {
              $map: {
                "input": "$$pdf.ProductDetailInfo",
                as: "e",
                in: {
                  $cond: [
                    {
                      $gte: [
                        "$$e.ProductScore.Rating",
                        99
                      ]
                    },
                    {
                      $mergeObjects: [
                        "$$e",
                        {
                          PageNumber: "$$pdf.PageNumber"
                        }
                      ]
                    },
                    null
                  ]
                }
              }
            },
            as: "i",
            cond: {
              $ne: [
                "$$i",
                null
              ]
            }
          }
        }
      }
    }
  }
},
{
  $addFields: {
    "ProductField.ProductDetailFields": {
      "$arrayElemAt": [
        "$ProductField.ProductDetailFields",
        0
      ]
    }
  }
})

LIVE VERSION

【讨论】:

  • 是的,它正在工作,感谢您的时间,您知道如何在 MongoDB 指南针或管道脚本中运行。 ith 抛出语法错误。
  • 如果解决了,请接受@MohamedSahir 的回答。是艰苦的工作
  • 是的。我已经尝试在指南针中添加阶段,我在语法中添加了一些错误。所以然后我尝试使用我们托管的 mongodb NoSQL 客户端,它具有聚合下拉功能,在那里我删除了 db.collection.aggregate({}});下面的行并粘贴执行查询。我在那里添加了图片。请您查看回复是否对我很有帮助。
  • 您能帮我在 Skype 上联系我或聊天 free2fly.sahir@gmail.com。我仍然面临着它没有在 NoSQL 客户端中运行的问题 - nosqlclient.com, thttps://www.nosqlclient.com/demo/ 否则你可以在该客户端中创建一个集合并使其对我来说也可以使用。跨度>
  • 没问题,我是 MongoDB 新手,我可以在 robo3t 中编写查询,命令所有教程都提供了命令提示符或基于语法的查询的参考,但是当尝试在 compass 或NoSQL 客户端不起作用。但是您提供的查询也不太复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 2023-03-18
  • 2015-08-13
  • 1970-01-01
  • 2018-08-13
  • 2021-11-14
相关资源
最近更新 更多