示例文档:
{"name":"John", "age":35, "level":"trainee",.....}
示例:
预期结果是:
[John, Jane], [Adam, Bob], [Lee]
上面的方括号表示同一方括号内的顺序无关紧要。所以简也可能出现在约翰面前(因为他们处于相同的标准)。但John和Jane必须出现在Adam和Bob之前,因为join_month = 3具有更高的优先级,即level = supervisor。并且还注意到即使约翰也符合等级=主管标准,他也没有再次被包括在内,因为他已经遇到了join_month = 3.
这在MongoDB中是可行的吗?
答案 0 :(得分:0)
如您需要订购,您可以使用以下聚合。
pipeline = [
{
$match: {$or: [{join_months: 3}, {level: 'Supervisor'}, {nationality: {$ne: 'MY'}}
]}
},
{
$project: {
name: 1,
age: 1,
join_priority: {$cond: [{$eq: ['$join_months', 3]}, 1, 0]},
leve_priority: {$cond: [{$eq: ['$level', 'supervisor']}, 1, 0]},
}
},
{
$sort: {join_priority: -1, level_priority: -1}
}
];
db.mycollection.aggregate(pipeline);
答案 1 :(得分:0)
在SQL查询中,您不需要UNION
运算符,因为您从同一个表中进行选择。您应该使用OR
运算符。 MongoDB提供了一个MongoDB CRUD Tutorials运算符,可以执行您想要的操作。
您的SQL查询:
SELECT NAME, AGE FROM EMPLOYEE
WHERE JOIN_MONTH=3
OR LEVEL='SUPERVISOR'
OR NATIONALITY <> 'MY'
在MongoDB中:
db.EMPLOYEE.find( {
"$or": [
{ "join_month": 3 },
{ "level": "supervisor" },
{ "nationality": { "$ne": "my" } }
] },
{ "name": 1, "_id": 0, "age": 1 }
)
您需要的一切都在文档中。您应该从官方SQL to MongoDB Mapping Chart开始,然后查看.aggregate()
如果要根据某些字段值对结果进行排序,则需要使用$match
方法来提供对聚合管道的访问。管道中的第一个阶段是$project
阶段,您只选择符合条件的文档。这也减少了下一阶段要处理的文档的大小,这是$cond
阶段,您使用$sort
运算符返回将用于对查询结果进行排序的字段的值在"weighting"阶段。此过程称为{{3}}
db.collection.aggregate([
{ "$match": {
"$or": [
{ "join_month": 3 },
{ "level": "supervisor" },
{ "nationality": { "$ne": "MY" } }
]
}},
{ "$project": {
"name": 1,
"age": 1,
"_id": 0,
"criteria": {
"$cond": [
{ "$eq": [ "$join_month", 3 ] },
3,
{ "$cond": [
{ "$eq": [ "$level", "supervisor" ] },
2 ,
1
] }
]
}
}},
{ "$sort": { "criteria": -1 } }
])