我有以下表格的文件:
{
_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 ]
}
我需要在数组中插入其他值
答案 0 :(得分:2)
您应该可以使用$isNull
(reference):
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 强> 获取任意数量的数组并返回一个数组 包含出现在任何输入数组中的元素。