标签: aggregation-framework

mongoDB中的数组内部正则表达式

我想在mongodb中使用正则表达式在数组内部进行查询,这些集合包含如下文档:

{
"_id" : ObjectId("53340d07d6429d27e1284c77"),
"company" : "New Company",
"worktypes" : [ 
    {
        "name" : "Pompas",
        "works" : [ 
            {
                "name" : "name 2",
                "code" : "A00011",
                "price" : "22,22"
            }, 
            {
                "name" : "name 3",
                "code" : "A00011",
                "price" : "22,22"
            }, 
            {
                "name" : "name 4",
                "code" : "A00011",
                "price" : "22,22"
            }, 
            {
                "code" : "asdasd",
                "name" : "asdads",
                "price" : "22"
            }, 
            {
                "code" : "yy",
                "name" : "yy",
                "price" : "11"
            }
        ]
    }, 
    { …
Run Code Online (Sandbox Code Playgroud)

regex mongodb mongodb-query aggregation-framework

7
推荐指数
1
解决办法
7124
查看次数

在Mongo中分离不同的价值观

我想从我的数据库中的集合中检索字段的区域值.该distinct命令是显而易见的解决方案.问题是某些字段具有大量可能的值并且不是简单的原始值(即,复杂的子文档而不仅仅是字符串).这意味着结果很大,导致我将结果传递给客户端.

显而易见的解决方案是对得到的不同值进行分页.但我找不到最佳方法来做到这一点.由于distinct没有分页选项(限制,跳过等),我转向聚合框架.我的基本管道是:

[
  {$match: {... the documents I am interested in ...}},
  {$group: {_id: '$myfield'},
  {$sort: {_id: 1},
  {$limit: 10},
]
Run Code Online (Sandbox Code Playgroud)

这给了我前10个唯一值myfield.为了获得下一页,将向管道中添加$ skip运算符.所以:

[
  {$match: {... the documents I am interested in ...}},
  {$group: {_id: '$myfield'},
  {$sort: {_id: 1},
  {$skip: 10},
  {$limit: 10},
]
Run Code Online (Sandbox Code Playgroud)

但有时候,我从中收集唯一值的字段是一个数组.这意味着我必须在分组之前解开它.所以:

[
  {$match: {... the documents I am interested in ...}},
  {$unwind: '$myfield'}
  {$group: {_id: '$myfield'},
  {$sort: {_id: 1},
  {$skip: 10},
  {$limit: 10},
]
Run Code Online (Sandbox Code Playgroud)

其他时候,我获得唯一值的字段可能不是数组,但它的父节点可能是一个数组.所以:

[
  {$match: {... the documents …
Run Code Online (Sandbox Code Playgroud)

performance mongodb aggregation-framework

7
推荐指数
0
解决办法
1684
查看次数

$lookup 当 foreignField 在嵌套数组中时

我有两个集合:

学生

 {    
    _id: ObjectId("657..."),  
    name:'abc'
 },  
 {  
    _id: ObjectId("593..."),  
    name:'xyz'
 }
Run Code Online (Sandbox Code Playgroud)

图书馆

 {    
    _id: ObjectId("987..."),  
    book_name:'book1',
    issued_to: [
      {
       student: ObjectId("657...")
      },
      {
       student: ObjectId("658...")
      }
    ]
 },  
 {  
    _id: ObjectId("898..."),  
    book_name:'book2',
    issued_to: [
     {
       student: ObjectId("593...")
     },
     {
       student: ObjectId("594...")
     }
   ] 
 }
Run Code Online (Sandbox Code Playgroud)

我想创建一个 Join to Student集合,该集合存在于Library集合的对象字段的issue_to数组中。

我想对学生收藏进行查询以获取学生数据以及图书馆收藏,如果学生存在或不存在,它将检查issued_to数组,否则获取图书馆文档。我试过 $lookup of mongo 3.6 但我没有成功。

db.student.aggregate([{$match:{_id: ObjectId("593...")}}, $lookup: {from: 'library', let: {stu_id:'$_id'}, pipeline:[$match:{$expr: {$and:[{"$hotlist.clientEngagement": "$$stu_id"]}}]}])
Run Code Online (Sandbox Code Playgroud)

但它会引发错误,请在这方面帮助我。我还查看了在 stackoverflow 上提出的其他问题,例如。上计算器问题对问题2计算器但这些comapring简单字段不是对象的数组。请帮我

mongodb mongodb-query aggregation-framework

7
推荐指数
1
解决办法
3530
查看次数

如何使用 Mongoose 在 mongoDB 中的 3 个集合中填充

我有三个集合,例如UserProgram和`议程。这些模型如下。

用户模型

const mongoose = require('mongoose');

const UserSchema = mongoose.Schema({
    name: {type:String},
    email: {type:String}
},{timestamps:true
}
);

module.exports = mongoose.model('User', UserSchema);
Run Code Online (Sandbox Code Playgroud)

程序模型

const mongoose = require('mongoose');

const NoteSchema = mongoose.Schema({
    name: {type:String},
    timefrom: {type:Date},
    timeto: {type:Date},
    status: {type:String},
    venue: {type:String},
    timetype: {type:Number},
    userid:{type:mongoose.Schema.Types.ObjectId,ref : 'User', required: true},
    logo :{type:String,default: 'programe'}
},{timestamps:true
});

module.exports = mongoose.model('Program', NoteSchema);
Run Code Online (Sandbox Code Playgroud)

议程模型

const mongoose = require('mongoose');

const AgendaSchema = mongoose.Schema({
    name: {type:String},
    timefrom: {type:Date},
    timeto: {type:Date},
    status: {type:String},
    proorder: {type:String},
    proid:{type:mongoose.Schema.Types.ObjectId,ref …
Run Code Online (Sandbox Code Playgroud)

mongoose mongodb node.js mongodb-query aggregation-framework

7
推荐指数
1
解决办法
4258
查看次数

在mongodb聚合中项目嵌套嵌入文档

我有一个嵌套的嵌入式文档,看起来像这样。每个帖子都有 n 条评论,每条评论都有一个包含姓名和电子邮件 ID 的用户详细信息。

我只想将评论用户的姓名投影到列表中

{
    "PostId":"Post001",
    "Comments":[
         {"_id": "001",
          "CommentedBy":{
            "_id":"User001",
            "Name":"UserName001",
            "email":"user001@eg.com"
            }
         },
         {"_id": "002",
           "CommentedBy":{
            "_id":"User002",
            "Name":"UserName002",
            "email":"user001@eg.com"
            }
         },
         {"_id": "003",
          "CommentedBy":{
            "_id":"User003",
            "Name":"UserName003",
            "email":"user001@eg.com"
            }
         }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想通过使用 mongodb 的聚合管道转换成看起来像这样的东西。

{
    "PostId":"Post001"
    "Comments":[
         {"_id": "001",
          "CommentedBy":"UserName001",
         },
         {"_id": "002",
           "CommentedBy": "UserName002"
         },
         {"_id": "003",
          "CommentedBy": "UserName003"
         }
    ]
}
Run Code Online (Sandbox Code Playgroud)

使用 mongo 的投影查询提供了一个CommentedBy包含所有名称的列表。我如何使用 mongo 的聚合查询来实现这一点。有没有办法不使用$unwind.

我试过的查询和我得到的结果。

db.getCollection('post').aggregate([
{$project:{"Comments.CommentedBy":"$Comments.CommentedBy.Name"}}
])

{
    "_id" : ObjectId("5b98b4cc3bb8c65aeacabd78"),
    "Comments" : [ 
        {
            "CommentedBy" …
Run Code Online (Sandbox Code Playgroud)

mongodb pymongo mongodb-query aggregation-framework

7
推荐指数
2
解决办法
7911
查看次数

如何计算 mongo db 中的 $lookup 字段?

我在 mongodb 中很新,现在我需要计算一个 $lookup 字段,这可能吗?

我有这样的事情:

result = await company.aggregate([
  {
    $lookup: {
      from: 'userFocus',
      localField: '_id',
      foreignField: 'value',
      as: 'focusUsers'
    }
  },
  {
    $project:{
      name: 1,
      focusUsers: {userId: 1}
    }
  }
])
Run Code Online (Sandbox Code Playgroud)

结果如下所示:

[
  {_id: 'xxxx', name: 'first company', focusUsers: [user1, user2, user3...]},
  {_id: 'yyyy', name: 'second company', focusUsers: []},
  {_id: 'zzzz', name: 'third company', focusUsers: []}
]
Run Code Online (Sandbox Code Playgroud)

现在我想要一个额外的列显示 focusUsers 计数,换句话说,我想要一个如下所示的结果:

[
  {_id: 'xxxx', name: 'first company', focusUsers: [user1, user2, user3], focusCount: 3},
  {_id: 'yyyy', name: 'second company', focusUsers: …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

7
推荐指数
1
解决办法
3140
查看次数

在猫鼬中反向填充

我怎样才能在 mongo 中反向填充。我有 2 个架构

用户:

var user_scheme = new mongoose.Schema({
  name:String,
  age:Number,
  roles:{
    type:mongoose.Schema.Types.ObjectId,
    ref:'Role'
  }
 });
Run Code Online (Sandbox Code Playgroud)

角色:

var role_scheme = new mongoose.Schema({
  name:String,
});
Run Code Online (Sandbox Code Playgroud)

文件:

///user
{
"_id" : ObjectId("5bf9a19b01ce3e19b440aed8"),
"name" : "user1",
"age" : 22,
"roles" : ObjectId("5c0242621ab7b677e6b2e01e"),
"__v" : 0
}
 ///role
{
"_id" : ObjectId("5c0242621ab7b677e6b2e01e"),
"name" : "Admin"
}
Run Code Online (Sandbox Code Playgroud)

代码:

User.find().populate('roles').exec(function (err, data) {
 res.json(data);
})
Run Code Online (Sandbox Code Playgroud)

在这里我可以在用户下获得角色,但是我如何在每个角色下获得用户。

mongoose mongodb node.js mongodb-query aggregation-framework

7
推荐指数
2
解决办法
3648
查看次数

MongoDB中$和$$的区别

我想知道MongoDB$$$MongoDB之间有什么区别。

例如:

    '$sum': {
        '$map': {
            'input': '$data',
            'as': 'currentData',
            'in': { '$size': '$$currentData.d' }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果我将使用$而不是$$in 呢$$currentData.d

mongodb aggregation-framework

7
推荐指数
1
解决办法
2550
查看次数

如何使用 DBRef 加入 MongoDB

我有两个文档,这些文档之间有 DBRef 关系。

{
  "_id": 77,
  "title": "Test title",
  "status": "in-progress",
  "reporter": {
    "$ref": "User",
    "$id": ObjectId("5daf022549a36e319879f357"),
    "$db": "test"
  },
  "priority": "high",
  "project": {
    "$ref": "Project",
    "$id": 30,
    "$db": "gsc"
  }
}
Run Code Online (Sandbox Code Playgroud)

用户文档:

{
  "_id": ObjectId("5daf022549a36e319879f357"),
  "username": "user1",
  "email": "test@gmail.com",
  "is_active": true,
  "firstName": "user-1"
}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下查询,但没有得到正确的结果

{
  "_id": 77,
  "title": "Test title",
  "status": "in-progress",
  "reporter": {
    "$ref": "User",
    "$id": ObjectId("5daf022549a36e319879f357"),
    "$db": "test"
  },
  "priority": "high",
  "project": {
    "$ref": "Project",
    "$id": 30,
    "$db": "gsc"
  }
}
Run Code Online (Sandbox Code Playgroud)

如何执行JOIN?另外,想要同时记录所有数据吗? 我想要来自任务文档的数据并建议如何加入项目字段。

需要这样的结果:

{
"_id" …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

7
推荐指数
1
解决办法
173
查看次数

有条件地减少 Mongo 聚合中的两个数组字段

我有一个如下所示的集合:

{
  "_id": 1,
  "user": "xyz",
  "sentence": "I watch movies and web series.",
  "nouns": [
    "movies",
    "web series"
  ],
  "verbs": [
    "watch"
  ]
},
{
  "_id": 2,
  "user": "xyz",
  "sentence": "movies are good way to relax",
  "nouns": [
    "movies"
  ],
  "verbs": [
    "relax"
  ]
}
Run Code Online (Sandbox Code Playgroud)

有两个数组字段,nounsverbs为每个用户的句子。我想按user字段对文档进行分组,并分别计算nounsverbs数组中每个不同元素的数量。我已经尝试了以下查询(如果你不想,你可以跳到这个聚合的最后阶段):

{
  "_id": 1,
  "user": "xyz",
  "sentence": "I watch movies and web series.",
  "nouns": [
    "movies",
    "web series"
  ],
  "verbs": [
    "watch"
  ]
},
{ …
Run Code Online (Sandbox Code Playgroud)

arrays mongodb mongodb-query aggregation-framework

7
推荐指数
1
解决办法
553
查看次数