首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MongoDB如果字段B,则按字段A排序!= null,否则按字段C排序

MongoDB如果字段B,则按字段A排序!= null,否则按字段C排序
EN

Stack Overflow用户
提问于 2019-02-21 23:30:54
回答 1查看 2.4K关注 0票数 3

我面临着这样的挑战:

如果字段B存在/不为空,则检索按字段A排序的文档。否则按字段C排序。

在SQL环境中,我会执行两个查询并创建一个UNION SELECT,但我不知道如何开始使用Mongo。

map/reduce是正确的方法吗?或者我应该专注于“计算字段”,并使用这个字段。我是MongoDB的新手,我在问路。

编辑:根据要求,这里有一些示例数据:

给定:

代码语言:javascript
复制
|     ID     | FieldA | FieldB | FieldC |
|------------|--------|--------|--------|
| Document 1 |     10 | X      |     40 |
| Document 2 |     20 | <null> |     50 |
| Document 3 |     30 | Z      |     60 |

预期结果(顺序),包括以计算作为注释的列

代码语言:javascript
复制
|     ID     | FieldA | FieldB | FieldC | "A" if "B" !=<null> else "C" |
|------------|--------|--------|--------|------------------------------|
| Document 1 |     10 | X      |     40 |                           10 |
| Document 3 |     30 | Z      |     60 |                           30 |
| Document 2 |     20 | <null> |     50 |                           50 |

谢谢你,舒比

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-22 04:10:04

给定以下文档:

代码语言:javascript
复制
{ "a": 10, "b": "X",  "c" : 40 }
{ "a": 20, "b": null, "c" : 50 }
{ "a": 30, "b": "Z",  "c" : 60 }

这样做的一种方法是:

代码语言:javascript
复制
db.collection.aggregate({
    $addFields: {
        "sortField": { // create a new field called "sortField"
            $cond: { // and assign a value that depends on
                if: { $ne: [ "$b", null ] }, // whether "b" is not null
                then: "$a", // in which case our field shall hold the value of "a"
                else: "$c" // or else it shall hold the value of "c"
            }
        }
    }
}, {
    $sort: {
        "sortField": 1 // sort by our computed field
    }
}, {
    $project: {
        "sortField": 0 // remove "sort" field if needed
    }
})

如果您的文档没有b字段,如下所示:

代码语言:javascript
复制
{ "a": 20, "c" : 50 }

然后,您需要应用上述here中的一种技术。

因此,您在$cond中的if部件可能如下所示:

代码语言:javascript
复制
if: { $ne: [ "$b", undefined ] }, // whether "b" is null or doesn't exist at all
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54810712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档