Javascript MongoDB:在文档集上设置操作,如何设置?

Javascript MongoDB:在文档集上设置操作,如何设置?,javascript,sql,mongodb,Javascript,Sql,Mongodb,在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) {

在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))
}
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()
我知道我可以像使用
lodash
一样操作结果数组,但问题是我必须逐页显示结果,因此在每次请求时,我应该获取每页显示的文档数

如果我选择
lodash
,那么我将始终从数据库中获取所有数据,然后使用
lodash
选择正确的页面。取回所需的东西会更有效

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

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

您可以尝试使用和聚合

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

请发布你的样本集和输出…@AnthonyWinzlet,我刚刚添加了更多细节。谢谢Anthony,我将尝试一下。我从未使用过刻面,但我相信它会成功的。但我有一个问题,我不明白$limit操作符在开头的意思?我希望在$replaceRoot之后可以使用$sort和$limit?是的,您可以在管道末尾使用
$sort
$limit
。。。为什么
$limit
操作员在开始时?因为我没有考虑使用根集合(聚合从根集合开始)来降低复杂性。。。我只需使用
$lookup
获取两个集合,然后将它们的数据与
$concatarray
合并,这与unionAll相同,并使其成为一个集合数据…好的,谢谢。尚未测试,但我相信它会起作用。我必须先了解面,请你检查一下这个问题@acmoune好的,我会调查的。。。请稍等