基于过滤器cond从阵列投射文档

时间:2016-06-08 15:06:05

标签: mongodb

我有一个相当复杂的文档,但这里是我可以把它放在这里的样本。

我有地址'具有多个地址文档的数组,如

addresses : [
           {'code': '1', line:'abc town'}, {'code':'2', line:'bcd town'},{'code':'3', line: 'another town'}

我想根据代码提取文档。例如代码:1然后只是拉这个文件,如果没有看是否有代码:2,是的然后拉这个文件,否则拉其他任何可用的

我的文档结构如下所示

[
 _id:123
  fn: 'name',
  addresses : [
               {'code': '1', line:'abc town'}, {'code':'2', line:'bcd town'},{'code':'3', line: 'another town'}
 ]

我写的查询是

db.collection.aggregate([{$match: {'_id':123}},
{$project: {
"fn" :1,
    "addresses": {$filter: {
        input: '$addresses',
        as: 'address',
        cond: {$eq: ['$$address.code', '1']}
    }},
    _id: 0
}}

当代码等于1(显然)时它可以工作但是我不知道怎么做" if else"条件我需要我上面解释的方式,如果代码== 1然后只拉动该文件,如果没有看代码== 2然后拉那个文件,如果不是所有其他拉动任何可用的。

我知道解释起来很复杂,但我认为我的$ filter cond需要一些修复。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

我不知道这是否有效,我也不知道你想要做什么比较。如果你给我这些信息,我将重新创建数据集并在我的最后尝试。

db.collection.aggregate([{$match: {'_id':123}},
{$project: {
"fn" :1,
    "addresses": {$cond: {
        if: {$eq: ["YOUR_EXPRESSION": 1]},
        then: "addresses.0.line",
        else: "addresses.1.line"
    }},
    _id: 0
}}