我想构建一个查询,其中我在聚合的$project
阶段根据之前的文档数据设置了true
或false
的密钥。
这是我正在寻找的结构:
[
{
"_id": "5a79725a2ca81e5b7f84ef50",
"name": "Lola",
"hasDog": true,
"neighbourWithDog": false,
"address": "1st Street"
},
{
"_id": "5a79725a5933283ab266e006",
"name": "Nick",
"hasDog": false,
"neighbourWithDog": true,
"address": "1st Street"
}
]
字段neghbourWithDog
取决于前一个文档中hasDog
是设置为true还是false。
我可以在数据库响应之后轻松完成此操作,通过循环和if语句构建新响应,但是当数据开始堆积时,应用程序(Node JS)变得非常慢。
所以我想知道是否甚至可以执行这样的查询?我确实知道文档可以按任何顺序排列,所以我必须先对它们进行排序。
答案 0 :(得分:0)
两种方式。首先是$project
,第二个是$addFields
。两者都使用$cond
来检查"hasDog"
是true
还是false
。
我的文件如下:
/* 1 */
{
"_id" : ObjectId("5a7996911f496a82583c265a"),
"name" : "Lola",
"hasDog" : true,
"address" : "1st Street"
}
/* 2 */
{
"_id" : ObjectId("5a7996971f496a82583c266a"),
"name" : "Nick",
"hasDog" : false,
"address" : "1st Street"
}
$project
方式:
db.getCollection('foo').aggregate([
{ $project :
{ _id : 0,
neighbourWithDog :
{ $cond:
{ if:
{ $eq : [ "$hasDog", true ] }, then: true, else: false }
}
}
}
])
输出:
/* 1 */
{
"neighbourWithDog" : true
}
/* 2 */
{
"neighbourWithDog" : false
}
或$addFileds
方式:
db.getCollection('foo').aggregate([
{ $addFields:
{ neighbourWithDog :
{ $cond:
{ if: { $eq : [ "$hasDog", true ] }, then: "true", else: "false" }
}
}
}
])
输出:
/* 1 */
{
"_id" : ObjectId("5a7996911f496a82583c265a"),
"name" : "Lola",
"hasDog" : true,
"address" : "1st Street",
"neighbourWithDog" : "true"
}
/* 2 */
{
"_id" : ObjectId("5a7996971f496a82583c266a"),
"name" : "Nick",
"hasDog" : false,
"address" : "1st Street",
"neighbourWithDog" : "false"
}
请注意,如果您不想要字符串"true"
或"false"
,请删除" "
,而您将拥有Boolean
值,就像$projection
示例