use*_*819 6 mongodb aggregation-framework
我有以下形式的文件:
{
_id : ObjectId(.....),
prop1 : "foo",
links : [ 1, 2, 3, 4 ]
}
{
_id : ObjectId(.....),
prop1 : "bar",
links : [ 5, 6, 7, 8 ]
}
Run Code Online (Sandbox Code Playgroud)
我使用聚合框架来处理这些文档,我使用$ unwind为links数组中的每个值生成一个文档.
但我有三种情况需要在调用$ unwind之前更新文档,我一直在查看$ project操作,但我找不到有关如何为以下情况创建或更新数组的信息.
1)缺少链接属性
{
_id : ObjectId(.....),
prop1 : "far"
}
Run Code Online (Sandbox Code Playgroud)
我需要插入链接数组
2)links数组属性是一个空数组
{
_id : ObjectId(.....),
prop1 : "far",
links : []
}
Run Code Online (Sandbox Code Playgroud)
我需要在数组中插入一个值
3)links数组的值太少
{
_id : ObjectId(.....),
prop1 : "far",
links : [ 9, 10 ]
}
Run Code Online (Sandbox Code Playgroud)
我需要在数组中插入其他值
您应该能够使用$isNull(参考):
db.test.aggregate({ $project : { the_links: { $ifNull : ["$links" , [5,6]]}} })
Run Code Online (Sandbox Code Playgroud)
逻辑很简单,如果引用的字段 ( ) 为 null,则使用$links替换值(在本例中为)。[5, 6]我将该字段重命名为the_links示例中的。
假设该links字段为空(并且不是空数组)。给定数据如下:
{ "_id" : ObjectId(...), "prop1" : "foo", "links" : [ 1, 2, 3, 4 ] }
{ "_id" : ObjectId(...), "prop1" : "bar" }
Run Code Online (Sandbox Code Playgroud)
上面的聚合产生:
{
"result" : [
{
"_id" : ObjectId("52a869d51d02442354276cff"),
"the_links" : [
1,
2,
3,
4
]
},
{
"_id" : ObjectId("52a869e31d02442354276d00"),
"the_links" : [
5,
6
]
}
],
"ok" : 1
}
Run Code Online (Sandbox Code Playgroud)
如果 links 是一个空数组[]而不是null,你可以这样做:
db.test.aggregate({ $project :
{ the_links: { $cond : [ { $eq : ["$links", []]}, '$links', [5,6]]}} })
Run Code Online (Sandbox Code Playgroud)
但是,如果它是 null 或[],那么您需要在运算符$or内添加对该条件的额外检查$cond。
如果列表有值,并且您想有条件地添加更多值,则当前 (2.4.x) 的 MongoDB 生产版本没有有效的解决方案。开发分支有一个名为 的运算符,它将返回数组 ( jira$size )的长度。然后,您可以使用另一个名为 $setUnion 的开发功能有条件地添加它们:
$setUnion 接受任意数量的数组并返回一个包含出现在任何输入数组中的元素的数组。