MongoDB 中的项目删除了文档中的一个级别
Project in MongoDB removing a level in the document
我有一个 collection 有这样的文档:
{
_id: "Id",
foo: {
variable1: {
value: "value1"
},
variable2: {
value: "value2"
}
}
}
其中 variable
可以有不同的值,我正在尝试通过 mongo 查询
获得类似的值
[
{
_id: "Id",
values: [
"value1", "value2"
]
}
]
可能吗?我不确定我是否可以通过聚合来做到这一点...
您可以通过一个简单的聚合查询来实现这一点,该查询将对象投影到一个数组中,然后根据文档 ID 将其重新分组。
db.test.aggregate([
{
$project: {
values: { $objectToArray: "$foo" }
}
},
{
$unwind: "$values",
},
{
$group : { _id: "$_id", values: { $push: "$values.v.value" } }
}
]);
上面会输出如下
{ "_id" : "Id", "values" : [ "value1", "value2" ] }
更新:
正如 mickl 在评论中所说,您还可以使用 $map
将所有值投影到 $project
阶段。
db.test.aggregate([
{
$project: {
values: {
$map: {
input: { $objectToArray: "$foo" },
as: "val",
in: "$$val.v.value"
}
}
}
}
]);
这也会输出
{ "_id" : "Id", "values" : [ "value1", "value2" ] }
我有一个 collection 有这样的文档:
{
_id: "Id",
foo: {
variable1: {
value: "value1"
},
variable2: {
value: "value2"
}
}
}
其中 variable
可以有不同的值,我正在尝试通过 mongo 查询
[
{
_id: "Id",
values: [
"value1", "value2"
]
}
]
可能吗?我不确定我是否可以通过聚合来做到这一点...
您可以通过一个简单的聚合查询来实现这一点,该查询将对象投影到一个数组中,然后根据文档 ID 将其重新分组。
db.test.aggregate([
{
$project: {
values: { $objectToArray: "$foo" }
}
},
{
$unwind: "$values",
},
{
$group : { _id: "$_id", values: { $push: "$values.v.value" } }
}
]);
上面会输出如下
{ "_id" : "Id", "values" : [ "value1", "value2" ] }
更新:
正如 mickl 在评论中所说,您还可以使用 $map
将所有值投影到 $project
阶段。
db.test.aggregate([
{
$project: {
values: {
$map: {
input: { $objectToArray: "$foo" },
as: "val",
in: "$$val.v.value"
}
}
}
}
]);
这也会输出
{ "_id" : "Id", "values" : [ "value1", "value2" ] }