mongodb - mongo 查询的格式化响应
问题描述
我看到一篇文章,我们可以使用 query:db.collection.find({"pc.pcId": "2"})
并获取基于pcId
. 结果:
{
"name" : "user",
"number":"09xxxxxxx21",
"pc" : [{
"pcId" : "1",
"pcName" : "Desktop",
"pcOwner" : "user1"
}, {
"pcId" : "2",
"pcName" : "Laptop",
"pcOwner" : "user1"
}
]}
}
我的问题是,如果我想要这样的结果怎么办:
{
"pcId" : "2",
"pcName" : "Desktop",
"pcOwner" : "user1"
}
不完整只记录我正在运行查询的特定结果。有什么疑问吗?
解决方案
您可以通过聚合来实现这一点。有几种方法
$unwind
展平阵列- 使用匹配对象
$match
$replaceRoot
有助于用对象替换整个文档
Mongo脚本如下
db.collection.aggregate([
{
"$unwind": "$pc"
},
{
$match: {
"pc.pcId": "2"
}
},
{
"$replaceRoot": {
"newRoot": "$pc"
}
}
])
工作Mongo游乐场
第二种方式
- 用于
$filter
过滤期望的输出 - 获得过滤结果后,您可以使用数组的第一个元素获得所需的输出
$arrayElemAt
- 如果 0 索引处没有元素,这将引发错误。为了防止它,我们使用
$ifNull
$replaceRoot
有助于用对象替换整个文档
mongo脚本是
[
{
$project: {
pc: {
$ifNull: [
{
$arrayElemAt: [
{
$filter: {
input: "$pc",
cond: {
$eq: [
"$$this.pcId",
"1"
]
}
}
},
0
]
},
[]
]
}
}
},
{
"$replaceRoot": {
"newRoot": "$pc"
}
}
]
工作Mongo游乐场
推荐阅读
- php - 为什么显示错误请求而不是在邮递员中工作
- sql - 如何将此 SQL 查询转换为 Neo4j Cypher 查询?
- javascript - 尝试 POST 请求时出现 Mongoose 验证错误
- javascript - 如何调用子组件(查看
) 和父组件中的路由器插座 - compilation - 将整数提升到 8 个字节,包括使用 IBM xlf 编译器显式声明的整数
- python - 如何查看 div 网格中的链接
- vue.js - Vue库自己的vuex
- javafx - 显示场景问题
- tensorflow - TF1 代码不适用于 TF2,有人可以转换此 TF1 代码吗
- r - 比较 R [r] 中两个不同长度的 data.frames