Javascript MongoDB$项目嵌入到根级别的文档
使用聚合管道,我尝试将嵌入文档投影到根级别,而不单独投影每个字段。 例如,我想将Javascript MongoDB$项目嵌入到根级别的文档,javascript,mongodb,mongodb-query,Javascript,Mongodb,Mongodb Query,使用聚合管道,我尝试将嵌入文档投影到根级别,而不单独投影每个字段。 例如,我想将name从此集合投影到根级别: [ { _id: "1", name: { firstName: "John", lastname: "Peters" } }, { _id: "2", name: { firstName: "Mary",
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"
}
}
]
这可以通过使用
$set
使用名称
子文档中的值更新所有文档来实现:
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" }
);
})
// { _id: "1", name: { firstName: "John", lastname: "Peters" } }
// { _id: "2", name: { firstName: "Mary", lastname: "Jones" } }
db.collection.aggregate({ $replaceWith: "$name" })
// { firstName: "John", lastname: "Peters" }
// { firstName: "Mary", lastname: "Jones" }
虽然我建议您使用
$project
,因为它比此解决方案性能更好,但我可以理解为什么您不想使用$project
以下是使用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" }
希望这能有所帮助。MongoDB 3.4在聚合管道中有了新的阶段-
$replaceRoot
,它完全按照要求执行
从
Mongo 4.2
开始,可以使用聚合运算符将一个文档替换为另一个文档(在本例中为子文档):
您可以像这样使用
$replaceRoot
:
db.collection.aggregate(
[
{
$replaceRoot : {
newRoot: {"$name"}
}
}
]
)
此外,如果要保留根文档中的字段,可以使用$mergeObjects
将其与嵌入的对象组合:
db.collection.aggregate(
[
{
$replaceRoot : {
newRoot: {
$mergeObjects: [
{"_id": "$_id"},
"$name"
]
}
}
}
]
)
不采用上述方法的基本原理是什么?使用-,您不会在最顶层得到它,但所有变量都可以包含在单个字段中。