标签: aggregation-framework

如何使用MongoDB聚合框架获取最后一个子字符串?

假设我有这些文件

> db.coll.find().toArray()
[
    {
        "_id" : ObjectId("5a36c3e218948d0722457078"),
        "locality" : "Nasimi, Baku, Azerbaijan"
    },
    {
        "_id" : ObjectId("5a36c3e218948d0722457079"),
        "locality" : "Garland, TX, USA"
    },
    {
        "_id" : ObjectId("5a36c3e218948d072245707a"),
        "locality" : "Halytskyi District, Lviv, Lviv Oblast, Ukraine"
    },
    {
        "_id" : ObjectId("5a36c3e218948d072245707b"),
        "locality" : "Tozeur, Tunisia"
    }
]
Run Code Online (Sandbox Code Playgroud)

我只想获取国家/地区,即最后一个逗号 ( ', ') 之后的内容。

例如

[
    "Azerbaijan",
    "USA",
    "Ukraine",
    "Tunisia"
]
Run Code Online (Sandbox Code Playgroud)

我已经设法获取第一个逗号的索引及其后的内容,但我不知道如何获取最后一个逗号。

[
    "Azerbaijan",
    "USA",
    "Ukraine",
    "Tunisia"
]
Run Code Online (Sandbox Code Playgroud)

这是可行的,但它会将所有结果加载到 JavaScript Mongo Shell 的内存中,但如果可以使用单个 MongoDB 聚合命令来完成,那就更理想了。

db.coll
  .aggregate([
    {
      $project: {
        lastIndexOf: …
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

2
推荐指数
1
解决办法
1940
查看次数

对 MongoDB 中的集合进行递归计数

我在 MongoDB 中有一个具有树结构的文档列表。我想要一个聚合查询,它返回给定_id属性的所有嵌套子项的计数。

结构:

{
  '_id': '1',
  'parentId': null,
},
{
  '_id': '2',
  'parentId': '1',
},
{
  '_id': '3',
  'parentId': '1',
},
{
  '_id': '4',
  'parentId': '3',
}
Run Code Online (Sandbox Code Playgroud)

聚合结果:(给出_id='1':)

{
  total_children: 3
}
Run Code Online (Sandbox Code Playgroud)

我知道这可能需要一个阶段,这个问题与 MongoDB 中集合的递归搜索$graphLookup非常相似,但在某种意义上是向后的。

tree recursion mongodb aggregation-framework

2
推荐指数
1
解决办法
1007
查看次数

使用 $map 进行 MongoDB 嵌套数组搜索

我有包含嵌套数组的集合。我需要根据以下条件获取数据:

empId : 19107
address.country: "AUS"
group.primaryGroup.primary:"Y"
group.subGroup.primarySubGroup.primary : "Y"
Run Code Online (Sandbox Code Playgroud)

输入:

{
    "empId": "19107",
    "address": [
        {
            "street": "no.12 wilson street",
            "country":"AUS"
        },
        {
            "description": "No.32 watson street",
            "country":"CAN"
        }
    ],
    "mobile": 2387468238,
    "group": [
        {
            "groupId": 75227,
            "primaryGroup": [
                {
                    "primary": "Y"
                },
                {
                    "primary": "N"
                }
            ],
            "subGroup": [
                {
                    "subGroupId": 123,
                    "primarySubGroup": [
                        {
                            "primary": "Y"
                        },
                        {
                            "primary": "N"
                        }
                    ]
                },
                {
                    "subGroupId": 234,
                    "primarySubGroup": [
                        {
                            "primary": "N"
                        },
                        {
                            "primary": "Y"
                        }
                    ] …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework spring-data-mongodb

2
推荐指数
1
解决办法
5210
查看次数

获取聚合中嵌套数组的总和

好吧,我有一个似乎无法解决的问题。

我有一个这样的文档:

{
  "playerId": "43345jhiuy3498jh4358yu345j",
  "leaderboardId": "5b165ca15399c020e3f17a75",
  "data": {
    "type": "EclecticData",
    "holeScores": [
      {
        "type": "RoundHoleData",
        "xtraStrokes": 0,
        "strokes": 3,
      },
      {
        "type": "RoundHoleData",
        "xtraStrokes": 1,
        "strokes": 5,
      },
      {
        "type": "RoundHoleData",
        "xtraStrokes": 0,
        "strokes": 4
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想要完成的是使用笔画的总和,然后再进行排序。我正在尝试这个:

var sortedBoard = db.collection.aggregate(
    {$match: {"leaderboardId": boardId}},
    {$group: {
        _id: "$playerId",
        played: { $sum: 1 },
        strokes: {$sum: '$data.holeScores.strokes'}
        }
    },
    {$project:{ 
        type: "$SortBoard",
        avgPoints: '$played',
        sumPoints: "$strokes",
        played : '$played'
    }}
);
Run Code Online (Sandbox Code Playgroud)

这里的问题是我确实得到了正确的笔划总和,因为这是在另一个数组内。

希望有人可以帮助我,并提前致谢:-)

mongodb aggregation-framework

2
推荐指数
1
解决办法
1672
查看次数

$在mongodb中过滤最多3层嵌套

我有以下收藏

[
  {
    "Array1": [
      {
        "Array2": [
          {
            "name": "6666",
            "Array3": [
              { "_id": 128938120, "nest": "samsung" },
              { "_id": 12803918239, "nest": "nokia" }
            ]
          },
          {
            "name": "5555",
            "Array3": [
              { "_id": 48102938109, "nest": "iphone" },
              { "_id": 501293890, "nest": "micromax" }
            ]
          }
        ],
        "name": "old apartment"
      },
      {
        "Array2": [
          {
            "_id": 410923810,
            "name": "3333",
            "Array3": [
              { "_id": 48102938190, "nest": "airtel" },
              { "_id": 48102938190, "nest": "jio" }
            ]
          },
          {
            "_id": 41092381029,
            "name": "2222", …
Run Code Online (Sandbox Code Playgroud)

javascript mongodb node.js mongodb-query aggregation-framework

2
推荐指数
1
解决办法
1133
查看次数

MongoDB — 如何根据匹配字段对查找进行排序?

在我的 Mongo 数据库中,我有两个集合 \xe2\x80\x94speakersspeeches,并且我可以使用以下代码块“加入”它们(获取演讲者的演讲):

\n\n
// I\'ve already found the \'speaker\' in the database\ndb.collection(\'speakers\').aggregate([{\n    $match: { "uuid": speaker.uuid } },\n    { $lookup: {\n        from: "speeches",\n        localField: "uuid",\n        foreignField: "speaker_id",\n        as: "speeches" } }\n]).toArray();\n
Run Code Online (Sandbox Code Playgroud)\n\n

它工作得很好,但我想按一个date或多个title字段对演讲数组进行排序,但我所做的一切似乎都无法实现。我在这里看到的示例都没有完成我需要它们做的事情。我尝试在块{ $sort: { "speech.title": -1 } }之后添加$lookup,但它什么也没做。这可能吗?

\n

mongodb aggregation-framework

2
推荐指数
1
解决办法
4123
查看次数

$sort 更改聚合结果顺序后 $limit 的 MongoDB 值

在简单迁移到聚合框架时,我遇到了问题.find().sort().skip().limit(),导致分页损坏:同一个文档出现在多个页面上。最后,我意识到这会影响结果$limit的顺序。$sort下面我将描述如何重现查看问题的步骤(在 Mongo 3.4.17 和 3.6.7 上检查)。

> // 1. Create a simple coleection and fill it with test data: 
> for(var i = 0; i < 10; ++i) db.SomeCollection.insert({sortField: "just_some_string"});
> db.SomeCollection.count();
10
>
> // 2. Check, that with .find().sort().limit() the order of results does not depend on the `limit()`'s value:
db.SomeCollection.find().sort({"sortField": 1}).limit(5)
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb531"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb532"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb533"), …
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

2
推荐指数
1
解决办法
1045
查看次数

mongodb 中未知键的查询

我有一个包含以下文档的集合:

{   
   map:{
     key1:value1,
     key2:value2, 
     ....
    }
}
Run Code Online (Sandbox Code Playgroud)

我想仅根据地图值过滤文档,而不管键,像map.*之类的东西等于某个值。可以这样做吗?

使用的MongoDB版本是3.4

mongodb mongodb-query aggregation-framework

2
推荐指数
1
解决办法
1513
查看次数

旧版本的 MongoDB 中是否有 $expr 的替代方案?

在 React.js 应用程序的 Node.js 后端中,我使用

"mongodb" (as db.version returns): "3.4.10",
"mongoose": "5.3.4"
Run Code Online (Sandbox Code Playgroud)

问题是我无法将 $expr 与 mongoDB 版本 < 3.6 一起使用。由于这个问题(不推荐使用的方法等),升级 mongoDB 版本似乎需要付出很大的努力。所以我想知道是否有一种方法可以在不使用 $expr 的情况下完成我想做的事情?

这是代码:

match.$expr = {
            $lt: ["$distance", "$range"] // "calculated_distance < tutor_range"
         }
Run Code Online (Sandbox Code Playgroud)

你知道怎么做吗?这是完整的方法,如果您想了解更多详细信息。

exports.search = (req, res) => {
  let lat1 = req.body.lat;
  let lon1 = req.body.lng;
  let page = req.body.page || 1;
  let perPage = req.body.perPage || 10;
  let radius = req.body.radius || 10000;

  let levelsIn = req.body.levels && req.body.levels.length !== 0 ? req.body.levels.map(level => …
Run Code Online (Sandbox Code Playgroud)

mongoose mongodb node.js aggregation-framework

2
推荐指数
1
解决办法
1244
查看次数

MongoDB:$lookup 数组后的 $sum

我有这个查询,并且正在使用$lookup,之后我想对value查找提供的数组中的求和。

我的查询(我正在使用猫鼬):

  User.aggregate([{
      $match: {
        storeKey: req.body.store,
      }
    },
    {
      $group: {
        _id: {
          id: "$_id",
          name: "$name",
          cpf: "$cpf",      
          phone: "$phone",
          email: "$email",
          birthday: "$birthday"      
        },
        totalServices: {
          $sum: "$services"
        }
      }
    },
    {
      $lookup: {
        from: "schedules",
        localField: "_id.phone",
        foreignField: "customer.phone",
        as: "user_detail"
      }  
    },
    { $project: { "user_detail.value": 1 } },
  ])
Run Code Online (Sandbox Code Playgroud)

我的查询结果(样本集合):

{
        "_id": {
            "id": "5bd89899bda5c343749d00f0",
            "name": "marcio",
            "cpf": null,
            "phone": "11999999999",
            "email": "marcio@gmail.com",
            "birthday": "2018-10-30T17:44:57.834Z"
        },
        "user_detail": [
            {
                "value": …
Run Code Online (Sandbox Code Playgroud)

mongoose mongodb node.js mongodb-query aggregation-framework

2
推荐指数
1
解决办法
3862
查看次数