MongoDB:对文档集进行设置操作,如何操作?

Posted

技术标签:

【中文标题】MongoDB:对文档集进行设置操作,如何操作?【英文标题】:MongoDB: Set operations on documents sets, how to? 【发布时间】:2018-07-14 20:14:08 【问题描述】:

在 MongoDB 中可以做到这一点吗?

select id, title from posts
union all
select id, name from programs
sort by title asc;

我想对来自两个不同集合的文档进行排序,并将结果视为一个集合。请帮忙。

已添加

其实我是在做文本搜索,但是我想搜索2个集合并合并结果:

我的快速路由处理程序如下所示:

// Post and Program are a Mongoose models
function (req, res) 
  const criteria = req.params.criteria

  Promise.all([
    Post
      .find($text: $search: criteria,  title: 1, score:  $meta: 'textScore' )
      .sort( score:  $meta: 'textScore'  )
      .exec(),

    Program
      .find($text: $search: criteria,  title: 1, score:  $meta: 'textScore' )
      .sort( score:  $meta: 'textScore'  )
      .exec()
  ])
    .then(results => reply([...results[0], ...results[1]]))
    .catch(err => handle(err))

我知道我可以使用lodash 像我想要的那样操作结果数组,但问题是我必须逐页显示结果,所以在每次请求时我都应该获取每页显示的文档数。

如果我选择lodash,那么我将始终从数据库中获取所有数据,然后选择带有lodash 的正确页面。只获取需要的内容会更有效率。

所以我希望有办法做这样的事情:

Post
  .find($text: $search: criteria,  title: 1, score:  $meta: 'textScore' )
  .unionAll(
    Program
      .find($text: $search: criteria,  title: 1, score:  $meta: 'textScore' )
  )
  .sort( score:  $meta: 'textScore'  )
  .limit(10)
  .exec()

我知道我在做梦,但这很有意义。 那么有没有办法从 MongoDB 中获取结果,或者我必须用 lodash 或类似的东西来管理它。

【问题讨论】:

请发布您的样本集合和输出... @AnthonyWinzlet,我刚刚添加了更多细节。 【参考方案1】:

您可以尝试使用$facet$lookup 聚合

db.collection.aggregate([
   "$limit": 1 ,
   "$facet": 
    "c1": [
       "$lookup": 
        "from": Post.collection.name,
        "pipeline": [
           "$match":  "$text":  "$search": criteria  ,
           "$project":  "title": 1 
        ],
        "as": "collection1"
      
    ],
    "c2": [
       "$lookup": 
        "from": Program.collection.name,
        "pipeline": [
           "$match":  "$text":  "$search": criteria  ,
           "$project":  "name": 1 
        ],
        "as": "collection2"
      
    ]
  ,
   "$project": 
    "data": 
      "$concatArrays": [ "$c1", "$c2" ]
    
  ,
   "$unwind": "$data" ,
   "$replaceRoot":  "newRoot": "$data"  
])

【讨论】:

谢谢安东尼,我正要试一试。我从未使用过 Facets,但我相信它会成功的。但我有一个问题,一开始我不明白 $limit 运算符的意义吗?我希望可以在 $replaceRoot 之后使用 $sort 和 $limit ? 是的,您可以在管道末尾使用$sort$limit... 为什么要在开头使用$limit 运算符? 因为我没有使用根集合(从聚合开始)考虑使其不那么复杂......我只需使用$lookup 获取两个集合并将它们的数据与$concatArrays 合并,这与unionAll 相同,并使其成为一个集合数据...... 好的,谢谢。尚未测试,但我相信它会工作。我必须先了解方面 请你检查这个问题***.com/questions/51361921/… @acmoune 好的,我会调查一下...请稍等

以上是关于MongoDB:对文档集进行设置操作,如何操作?的主要内容,如果未能解决你的问题,请参考以下文章

mongodb官网文档阅读笔记:write concern

MongoDB副本集的常用操作及原理

如何在猫鼬中进行原始 mongodb 操作?

如何在猫鼬中进行原始 mongodb 操作?

MongoDB开发之 管道操作符

mongodb----基础描述及安装