mongodb聚合,是否可以在$ project期间向数组添加条目

时间:2013-12-11 11:19:34

标签: mongodb aggregation-framework

我有以下表格的文件:

{
    _id : ObjectId(.....),
    prop1 : "foo",
    links : [ 1, 2, 3, 4 ]
}

{
    _id : ObjectId(.....),
    prop1 : "bar",
    links : [ 5, 6, 7, 8 ]
}

我使用聚合框架来处理这些文档,我使用$ unwind为links数组中的每个值生成一个文档。

但我有三种情况需要在调用$ unwind之前更新文档,我一直在查看$ project操作,但我找不到有关如何为以下情况创建或更新数组的信息。

1)缺少链接属性

{
    _id : ObjectId(.....),
    prop1 : "far"
}

我需要插入链接数组

2)links数组属性是一个空数组

{
    _id : ObjectId(.....),
    prop1 : "far",
    links : []
}

我需要在数组中插入一个值

3)links数组的值太少

{
    _id : ObjectId(.....),
    prop1 : "far",
    links : [ 9, 10 ]
}

我需要在数组中插入其他值

1 个答案:

答案 0 :(得分:2)

您应该可以使用$isNullreference):

db.test.aggregate({ $project : { the_links: { $ifNull : ["$links" , [5,6]]}} })

这是一个简单的逻辑,如果引用的字段($links)为空,则使用替换值(在本例中为[5, 6])。我在示例中将该字段重命名为the_links

假设links字段为空(而不是空数组)。给出如下数据:

{ "_id" : ObjectId(...), "prop1" : "foo", "links" : [  1,  2,  3,  4 ] }
{ "_id" : ObjectId(...), "prop1" : "bar" }

上面的汇总产生:

{
    "result" : [
            {
                    "_id" : ObjectId("52a869d51d02442354276cff"),
                    "the_links" : [
                            1,
                            2,
                            3,
                            4
                    ]
            },
            {
                    "_id" : ObjectId("52a869e31d02442354276d00"),
                    "the_links" : [
                            5,
                            6
                    ]
            }
    ],
    "ok" : 1
}

如果链接是空数组[]而不是null,则可以执行以下操作:

db.test.aggregate({ $project : 
     { the_links: { $cond : [ { $eq : ["$links", []]}, '$links', [5,6]]}} })

但是,如果它为null或[],那么您需要在$or运算符中添加$cond条件的额外检查。

如果列表具有值,并且您希望有条件地添加更多值,则MongoDB的当前(2.4.x)生成版本没有有效的解决方案。开发分支有一个名为$size的运算符,它将返回数组的长度(jira)。然后,您可以使用另一个名为$ setUnion的开发功能有条件地添加它们:

  

<强> $ setUnion   获取任意数量的数组并返回一个数组   包含出现在任何输入数组中的元素。