标签: aggregation-framework

获取列表中带有标签的文档,按匹配总数排序

鉴于以下MongoDB文档集合:

{
 title : 'shirt one'
 tags : [
  'shirt',
  'cotton',
  't-shirt',
  'black'
 ]
},
{
 title : 'shirt two'
 tags : [
  'shirt',
  'white',
  'button down collar'
 ]
},
{
 title : 'shirt three'
 tags : [
  'shirt',
  'cotton',
  'red'
 ]
},
...
Run Code Online (Sandbox Code Playgroud)

如何检索匹配标签列表的项目列表,按匹配标签的总数排序?例如,给定此标记列表作为输入:

['shirt', 'cotton', 'black']
Run Code Online (Sandbox Code Playgroud)

我想通过匹配标签的总数检索按desc顺序排列的项目:

item          total matches
--------      --------------
Shirt One     3 (matched shirt + cotton + black)
Shirt Three   2 (matched shirt + cotton)
Shirt Two     1 (matched shirt)
Run Code Online (Sandbox Code Playgroud)

在关系模式中,标记将是一个单独的表,您可以加入该表,计算匹配,并按计数排序.

但是,在Mongo ......?

似乎这种方法可行,

  • 将输入标记分成多个"IN"语句 …

mongodb aggregation-framework

8
推荐指数
2
解决办法
3323
查看次数

猫鼬对所有文档求和一个值

我希望计算与我的查询匹配的文档中名称数量的所有列,

 tickets.count({time: {$gte: a}, time: {$lte: tomorrow}}).then(function (numTickets) {
Run Code Online (Sandbox Code Playgroud)

如何获得称为金额的文档列的总结果?

例如,如果我有:

{ time: 20, amount: 40}
{ time: 40, amount: 20}
Run Code Online (Sandbox Code Playgroud)

它会返回总金额(60)?

请记住,我确实需要{time: {$gte: a}, time: {$lte: tomorrow}在查询中使用。

我该怎么做?

javascript mongoose mongodb aggregation-framework mongodb-aggregation

8
推荐指数
1
解决办法
1万
查看次数

如何在mongodb聚合中检查子字段是否存在且不为空?

我遇到了一个很烦人的问题,我似乎无法为我的特定情况找到任何解决方案。在我的 mongo 聚合管道中,我想添加一个字段,并且根据另一个字段的子字段的存在,我想分配该其他字段的子字段的值,如果该其他字段的子字段不存在,则为 1。

这是我尝试过的:

pipelineStages.push(
{$addFields: 
    {field: 
        {$cond: [
             {$ne: ["$otherField.subField", null]}, 
                    "$otherField.subField", 1]
             }
        }
     }
 );
Run Code Online (Sandbox Code Playgroud)

但是,它仅适用于该字段存在的情况。另一方面,该新字段根本没有添加到管道中。任何想法我做错了什么?

mongoose mongodb aggregation-framework

8
推荐指数
1
解决办法
6038
查看次数

如何将MongoDB中每个单词的首字母大写?

这应该是一个 2 分钟的快速查找,但我正在搜索一个小时并且找不到任何解决方案。

如何将字段中每个单词首字母大写username

{
    "_id" : ObjectId("5908288bfbce59540a67fa11"),
    "username" : "JOHN DOE"
},
{
    "_id" : ObjectId("5908288bfbce59540a67fa12"),
    "username" : "jane doe"
}
Run Code Online (Sandbox Code Playgroud)

尝试了这个我不太理解的解决方案,但它不起作用:Fetched 0 record(s) in 0ms

db.getCollection('test').toupper.aggregate(
    [
        {
            $project: {
                username: {
                    $concat: [{
                        $toUpper: { $substr: ["$username", 0, 1] }
                    }, { $substr: ["$username", 1, 3] }]
                }
            }
        }])
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

8
推荐指数
1
解决办法
4297
查看次数

Mongodb - 如何调试聚合步骤?

如何使用mongodbnode.js Node.js Mongodb 驱动程序的本机驱动程序调试 MongoDb 聚合步骤

我通过谷歌搜索找到的是这个npm包:https : //www.npmjs.com/package/mongo-aggregation-debugger

还有其他选择吗?

debugging mongodb node.js aggregation-framework

8
推荐指数
1
解决办法
2828
查看次数

查找聚合中的管道在 mongodb 中不起作用

我是 mongodb 的新手,所以我希望这不会成为一个非常基本的问题。我做了一些研究,并试图应用我所发现的东西,但有些东西似乎让我忽略了。

我有两个以下格式的集合:

-----------------------------------------------------------------------
Shop
-----------------------------------------------------------------------
{
    "shopId": "1002",
    "shopPosId": "10002",
    "description": "some description"
}

-----------------------------------------------------------------------
Compte
-----------------------------------------------------------------------
{
    "shopId": "9000",
    "shopPosId": "0000",
    "clientUid": "474192"
}
Run Code Online (Sandbox Code Playgroud)

我想加入这些,在这样做之前,我想过滤掉Shop没有该shopPosId字段的 s 。

这是我的代码:

Compte.aggregate([
    {
        $match:
            { 
                $and:[{"clientUid":clientUid}]
            }
    },
    {      
        $lookup:
        {
            from: "Shop",
            localField: "shopId",
            foreignField: "shopId",
            let: {"Shop.shopPosId": "$shopPosId"},
            pipeline: [{$match: {"shopPosId": {"$exists": false}}}],
            as: "shopDescr"
        }
        }]
);
Run Code Online (Sandbox Code Playgroud)

返回的结果是 an undefined,这意味着查询没有多大意义(因为实际上我至少应该得到一个 void 数组)。

难道是因为两个集合都有字段shopPosId?(如果是这样,这条线不let: {"Shop.shopPosId": "$shopPosId"}应该处理它吗?)

mongoose mongodb mongodb-query aggregation-framework

8
推荐指数
1
解决办法
3万
查看次数

在mongodb中使用单个查询的多个计数

我是Mongo Db的新手,非常感谢您对此查询的一些帮助.在过去的几天里,我一直在筛选这些帖子,撕扯我的头发,看看我是否能找到与我的查询相关但没有运气的任何内容.

我有一个集合,文档结构类似于下面:

_id: xyz
Movieid: 123
MovieName: Titanic
ReleaseDate: 2000-01-01

_id: uvw
Movieid: 456
MovieName: Titanic II
ReleaseDate: 2018-01-01

_id: pqr
Movieid: 789
MovieName: Titanic III
ReleaseDate: 
Run Code Online (Sandbox Code Playgroud)

我希望在3个单独的列中实现输出作为总电影,具有发布日期的电影和没有发布日期的电影的计数,如下所示:

Total   |   Released  |     UnReleased
 3      |       2     |          1
Run Code Online (Sandbox Code Playgroud)

我能够编写单独的查询来执行计数,但我无法将所有这些成功整合到单个查询中.最终目标是创建一个视图,将这些计数作为输出.我已经尝试使用$和等运算符,但似乎无法使查询按预期工作....这是我得到的:

db.getCollection("Movies").aggregate(
    $and: [
{ 
            "$match" : 
                {"ReleaseDate":{$exists:true}}
            }
        , 
        { 
            $count:"Total"
        },
        { 
            "$match" : 
                {"ReleaseDate":{$exists:true,$nin:[""]}}
            }
        , 
        { 
            $count:"Released"
        },

        { 
            "$match" : 
                {"ReleaseDate":{$exists:true,$in:[""]}}
            }
        , 
        { 
            $count:"Unreleased"
        }


    ]
);
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

8
推荐指数
1
解决办法
3799
查看次数

使用 $let 聚合 $lookup 不起作用

TblStudent在 mongodb 中有一个集合

       {
      "_id": ObjectId("5baa85041d7859f40d000029"),
       "Name": "John Doe",
       "RollNo": 12,
       "Class": "Ist"
        ....
       }
Run Code Online (Sandbox Code Playgroud)

我还有一个TblRoute

   {
   "_id": ObjectId("5baa818d1d78594010000029"),
   "Name": "New york City",
   "StopDetails": [
   {
    "StopId": "abc777",
    "Name": "Block no 3"
   },
   {
   "StopId": "abc888",
   "Name": "Block no 4"
   }
 ],
"NumberOfSeats": "10",
"StudentDetails": [
 {
   "StudentId": ObjectId("5baa85041d7859f40d000029"),
   "VehicleId": "7756"
  },
  {
   "StudentId": ObjectId("5baa85f61d7859401000002a"),
   "VehicleId": "7676"
 }
 ]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 mongodb 3.6 平台。我正在使用以下代码行

       $query = ['_id' => new MongoDB\BSON\ObjectID($this->id)];
    $cursor = $this->db->TblRoute->aggregate([
    ['$match' => $query], …
Run Code Online (Sandbox Code Playgroud)

aggregate-functions mongodb mongodb-php aggregation-framework php-mongodb

8
推荐指数
1
解决办法
9563
查看次数

Spring Data MongoDB 聚合 - 在投影中重命名 _id

在 mongo (3.6) shell 中,我可以执行以下聚合来投影并将“_id”重命名为其他名称:

db.collection.aggregate([
  { $group : { _id : ... },
  { $project : {   '_id': 0,        // exclude the id field
                   'name' : '$_id', // project the "old" id value to the "name" field
                   ...
               }
  }
])
Run Code Online (Sandbox Code Playgroud)

我需要使用 spring-data-mongo (通过 Spring Boot 2.3.1)来翻译它。我可以使用以下 ProjectionOperation 排除 id 字段:

project().andExclude("_id")
Run Code Online (Sandbox Code Playgroud)

但到目前为止我还无法重命名 id 字段。以下均无效:

这不应该那么难,但我不知道我错过了什么。


编辑:数据样本和完整的聚合管道以重现故障

并附有以下文件:

{ 
    "_id" : ObjectId("5a0c7a3135587511c9247db4"), 
    "_class" : "task", 
    "category" : "green", 
    "status" : "OK"
}
{ 
    "_id" …
Run Code Online (Sandbox Code Playgroud)

aggregation-framework spring-data-mongodb

8
推荐指数
1
解决办法
7360
查看次数

将 mongodb 中的对象数组转换为字符串数组

我正在查看以下文档

下面将文档插入到集合中classes

db.classes.insertMany( [
   { _id: 1, title: "Reading is ...", enrollmentlist: [ "giraffe2", "pandabear", "artie" ], days: ["M", "W", "F"] },
   { _id: 2, title: "But Writing ...", enrollmentlist: [ "giraffe1", "artie" ], days: ["T", "F"] }
] )
Run Code Online (Sandbox Code Playgroud)

members集合:

db.members.insertMany( [
   { _id: 1, name: "artie", joined: new Date("2016-05-01"), status: "A" },
   { _id: 2, name: "giraffe", joined: new Date("2017-05-01"), status: "D" },
   { _id: 3, name: "giraffe1", joined: new Date("2017-10-01"), status: …
Run Code Online (Sandbox Code Playgroud)

aggregation mongodb aggregation-framework

8
推荐指数
1
解决办法
6535
查看次数