代码之家  ›  专栏  ›  技术社区  ›  acmoune

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

  •  1
  • acmoune  · 技术社区  · 8 年前

    在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 但问题是,我必须逐页显示结果,所以每次请求时,我都应该获取每页显示的文档数。

    如果我去 落叶 ,然后我将始终从数据库中提取所有数据,然后用 落叶 . 只取需要的东西会更有效。

    所以我希望有一种方法可以做到这一点:

    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或类似的工具来管理它。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Ashh    8 年前

    $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" } }
    ])