我有一系列包含对象数组的文档:
async function getDNInfo(party) {
var result = await mongo.findOne({DN:party.user_Number}, "BWUsers");
return result;
}
是否可以提取/投影/添加该数组中的一个 one 元素字段?例如,数组第一个元素的db.collection.insert({
arr: [
{ id: 1, text: 'foo' },
{ id: 2, text: 'bar' },
]
});
字段。我在$addFields中尝试了MongoPlayground的各种变体,
text
,但什么也没有产生一个db.collection.aggregate([
{
$addFields: { text1: '$arr.text' }
}
]);
字段。充其量,我使用上面的语法得到了两者,但是为了在其上使用$ type,我只想要一个字段,因为它看起来像$type
can't inspect array elements。
答案 0 :(得分:1)
提取数组元素字段的一种方法是在$arrayElemAt
阶段使用$project
投影第一个元素,然后访问所需字段,例如text
,在第二个$project
阶段:
db.collection.aggregate([
{
$project: {
elem1: {
$arrayElemAt: ["$arr", 0]
}
}
},
{
$project: {
text1: "$elem1.text"
}
}
])
答案 1 :(得分:1)
您可以将$let与$arrayElemAt一起使用来定义临时变量,然后引用它来获取text
字段:
db.collection.aggregate([
{
$addFields: {
text1: {
$let: {
vars: {
first: {
$arrayElemAt: [ "$arr", 0 ]
}
},
in: "$$first.text"
}
}
}
}
])