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:对文档集进行设置操作,如何操作?的主要内容,如果未能解决你的问题,请参考以下文章