Javascript MongoDB:在文档集上设置操作,如何设置?
在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) {
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好的,我会调查的。。。请稍等