使用聚合管道,我尝试将嵌入的文档投影到根级别的,而不是单独投影每个字段。
例如,我希望将name
从这个集合投影到根级别:
[
{
_id: "1",
name: {
firstName: "John",
lastname: "Peters"
}
},
{
_id: "2",
name: {
firstName: "Mary",
lastname: "Jones"
}
}
]
这就是我要找的:
[
{
firstName: "John",
lastname: "Peters"
},
{
firstName: "Mary",
lastname: "Jones"
}
]
有没有办法在不单独投影每个字段的情况下做到这一点?我不想这样做:
db.collection.aggregate(
[
{
$project : {
"_id" : 0,
"firstName" : "$name.firstName",
"lastName" : "$name.lastName"
}
}
]
发布于 2017-04-06 05:26:31
MongoDB 3.4在聚合管道中有了一个新阶段-- $replaceRoot
,它做的正是我们所要求的。
https://docs.mongodb.com/manual/reference/operator/aggregation/replaceRoot/
发布于 2016-02-04 13:47:31
以下是使用JavaScript变量的解决方案。
# Set Object for what to project
var projectWhat = {'_id' : 0};
# Fill Object with keys
Object.keys(db.coll.findOne().name).forEach(function(x){
projectWhat[x] = "$name." + x;
});
# Do Aggregate
db.coll.aggregate([{$project : projectWhat}])
输出结果将是
{ "firstName" : "John", "lastname" : "Peters" }
{ "firstName" : "Mary", "lastname" : "Jones" }
希望这能有所帮助。
发布于 2016-02-04 02:25:11
这可以通过使用$set
用name
子文档中的值更新所有文档来实现:
db.collection.find({ "name": {"$exists": 1 } }).forEach(function(doc) {
var setName = {};
for ( var k in doc.name ) {
setName[k] = doc.name[k];
}
db.collection.update(
{ "_id": doc._id },
{ "$set": setName, "$unset": "name" }
);
})
虽然我建议您使用$project
,因为它比这个解决方案性能更好,但我可以理解您不想使用$project
的原因。
https://stackoverflow.com/questions/35183432
复制相似问题