在进行聚合时,如何检查mongodb对象中是否存在键,其中键是文档中某个其他字段的值?
首先,我知道我们可以使用点运算符检查钥匙是否存在,但在我的情况下,它不起作用,我不知道为什么 到目前为止,在聚合管道中,我有以下记录在进行聚合时,如何检查mongodb对象中是否存在键,其中键是文档中某个其他字段的值?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,首先,我知道我们可以使用点运算符检查钥匙是否存在,但在我的情况下,它不起作用,我不知道为什么 到目前为止,在聚合管道中,我有以下记录 { "my_key":"1234" "data":{ 1234:"abc" 4567:"xyz" } } { "my_key":"6666" "data":{
{
"my_key":"1234"
"data":{
1234:"abc"
4567:"xyz"
}
}
{
"my_key":"6666"
"data":{
1234:"abc"
4567:"xyz"
}
}
我想返回数据对象中不存在my_key
值的文档。因此,根据上面的示例,它应该返回第二个文档
我尝试使用$match
操作符,如下所示,但它似乎不起作用
$match :
{
"data.$my_key":{$exists:false}
}
这不起作用,我不明白为什么:(
这是因为my\u key
值是字符串,而数据
对象中的键不是字符串吗?
如果您需要原始格式的数据,您可以添加以下作为最后一个阶段
{
$project: {
"data": {
"$arrayToObject": "$data"
},
"my_key": 1
}
}
我完全可以这样做,但我无法解开
数据
字段:(因为这对我不起作用。为什么它不起作用?你所做的是正确的,并且是问题的实际答案,但我希望在不解开某个时间的答案的情况下实现同样的结果。请检查更新,只需几次尝试就可以做得更好
db.collection.aggregate([
{
"$project": {
"data": {
"$objectToArray": "$data"
},
"my_key": 1
}
},
{
$project: {
"output": {
"$map": {
"input": "$data",
"as": "data",
"in": {
"$eq": [
"$$data.k",
"$my_key"
]
}
}
},
"data": 1,
"my_key": 1
}
},
{
$match: {
output: true
}
}
])
{
$project: {
"data": {
"$arrayToObject": "$data"
},
"my_key": 1
}
}