【问题标题】:mongodb aggregate with match, lookup and projectmongodb 聚合与匹配、查找和项目
【发布时间】:2018-05-09 09:39:04
【问题描述】:

我是使用 mongodb 编程的 node js 新手。我正在使用mongodb 模块,我想使用用户公共信息执行帖子“加入”。我现在使用的代码如下:

db.collection('post').aggregate({ 
  '$match': { category: 'video', status: 'online' },
  '$lookup': 
   { 
     from: 'user',
     localField: 'user',
     foreignField: '_id',
     as:'user'
  },
  '$project': 
     { text: 1,
       imgs: 1,
       video: 1,
       datetime: 1,
       user: 1,
       category: 1,
       marketplace: 1,
       tags: 1 } }
})
.toArray(function(err,posts){console.log(posts)})

但没有任何效果。即使类别不是music,我也只会收到帖子,并且查找不会将对象绑定到结果数组。

更新 即使让 $match 参数仅作为聚合查询,聚合也不起作用

返回的集合是

[
  {
    "_id":"5aed6cbbd8362bcc0f2d95ab",
    "category":"music",
    "video":"",
    "imgs":[],
    "videoImage":false,
    "text":"post text",
    "tags":{["first","try"]}, 
    "datetime":1525509307968,
    "user":"FuRRTBEYBmCSDPJkN",
    "status":"online","marketplace":null}, 
  { 
    "_id":"5aedc26c6defa3d3a6de7126", "category":"music",
    "video":"https://www.youtube.com/embed/1yvLYJ2Fe_c", 
    "imgs" [],
    "videoImage":"https://i.ytimg.com/vi/1yvLYJ2Fe_c/hqdefault.jpg",
    "text":"second post text second post text second post text ",
    "tags":{["second","post"]},
    "datetime":1525531244425,
    "user":"FuRRTBEYBmCSDPJkN",
    "status":"online",
    "marketplace":null
   }
]

预期的结果是

[
  {
    "_id":"3aed6cbbd8362bcc0f2d95ab",
    "category":"video",
    "video":"",
    "imgs":[],
    "videoImage":false,
    "text":"post text",
    "tags":{["first","video"]}, 
    "datetime":1525509307968,
    "user": {_id: 'FuRRTBEYBmCSDPJkN', username: 'user1',img: '/path/to/the/image.png'},
    "status":"online","marketplace":null}, 
  { 
    "_id":"4aedc26c6defa3d3a6de7126", "category":"video",
    "video":"https://www.youtube.com/embed/1yvLYJ2Fe_c", 
    "imgs" [],
    "videoImage":"https://i.ytimg.com/vi/1yvLYJ2Fe_c/hqdefault.jpg",
    "text":"second video ",
    "tags":{["second","video"]},
    "datetime":1525531244425,
    "user":{_id: 'FuRRTBEYBmCSDPJkN', username: 'user1',img: '/path/to/the/image.png'},
    "status":"online",
    "marketplace":null
   }
]

【问题讨论】:

  • "as" 属性是要输出的字段的名称,而不是选择要返回的字段。该站点以及文档中已经发布了非常清晰的示例。从每个集合中发布示例文档,这些文档实际上会相互“连接”,以期有人能够帮助您。
  • 好的。谢谢你。即使在此编辑之后,也没有任何改变。
  • 再次向您展示收藏。 $lookup 操作期望 "user"localField 值包含 完全相同 值,该值在名为 "user" 的“集合”中(即 from"_id" 字段,如 foreignField。通常这意味着 ObjectId 值,因此请确保两者都具有并且它们匹配。这意味着其中一个实际上不能是字符串。
  • 展示你的收藏。说真的,如果你不这样做,那么问题将不得不被关闭。您不知道自己在做什么,为了让其他人帮助您,我们实际上需要“查看数据”。每隔几分钟添加粗体 EDIT 语句不会帮助任何人回答您的问题。对于我们看不到的东西,我们无能为力。
  • 真正的问题是你 expect category:'music' 。至少这是我阅读“预期结果将是”sn-p 代码的方式。没有应用 $match 只是因为管道的语法错误,它应该是一个阶段数组,它比通信问题更容易修复。

标签: node.js mongodb mongodb-query


【解决方案1】:

就像 Alex 在评论中所说,我的问题的解决方案是将 array 管道传递给聚合函数,如下所示。

db.collection('post').aggregate([
  '$match': { category: 'video', status: 'online' },
  '$lookup': 
   { 
     from: 'user',
     localField: 'user',
     foreignField: '_id',
     as:'user'
  },
  '$project': 
     { text: 1,
       imgs: 1,
       video: 1,
       datetime: 1,
       user: 1,
       category: 1,
       marketplace: 1,
       tags: 1 } }
])
.toArray(function(err,posts){console.log(posts)})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2015-08-09
    • 2023-02-25
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多