如果我有一个对象Post
有两个属性
Title
类型string- 布尔型
IsHomePage
- boolean类型的
IsTagged
当使用mongodb聚合框架和$unionWith
时,我可以在一个DB往返中选择我需要的东西(所有文档中IsHomePage
设置为true
,其余的设置为IsTagged
属性设置为true
。
db.collection.aggregate([
{
"$match": {
IsHomePage: true
}
},
{
"$unionWith": {
"coll": "collection",
"pipeline": [
{
"$match": {
IsHomePage: {
$ne: true
},
IsTagged: true
}
},
{
"$sample": {
"size": 50
}
}
]
}
}
])
我如何才能实现相同的旧MongoDB实例(那里有一个旧版本比4.4)。
注意:UnionWith在4.4版本中宣布。
查询
- this可以做union做的事情,但是有facet的限制(每个结果数组<16 MB,第二个几乎是肯定的,因为$sample)
*如果它不是你想要的,如果你能给出样本数据和预期的结果写query + test。
PlayMongo
aggregate(
[{"$facet":
{"home": [{"$match": {"$expr": {"$eq": ["$IsHomePage", true]}}}],
"notHome":
[{"$match":
{"$expr":
{"$and":
[{"$ne": ["$IsHomePage", true]}, {"$eq": ["$IsTagged", true]}]}}},
{"$sample": {"size": 50}}]}},
{"$project": {"union": {"$concatArrays": ["$home", "$notHome"]}}},
{"$unwind": {"path": "$union"}},
{"$replaceRoot": {"newRoot": "$union"}}])