我有以下记录的集合BookingDetails
:
{
"code" : "TICKET1234",
"orderDetails" : [
{
"cost": 150.0,
"movieName": "avengers"
}
]
},
{
"code" : "TICKET1235",
"orderDetails" : [
]
}
需要检查orderDetails.MovieName
在投影层上是否存在。我在下面的查询中尝试过,这没有帮助。
db.BookingDetails.aggregate([
{
$project: {
OrderExists: {
$cond: [
{ $ne: ["$orderDetails.0.movieName", null] },
1, 0
]
}
}
}
])
我不能在$ cond中使用$exists
。我也尝试过$ifNull
。需要您的想法。
答案 0 :(得分:1)
您可以使用以下汇总
db.collection.aggregate([
{ "$project": {
"OrderExists": {
"$cond": [{ "$ne": [{ "$ifNull": [{ "$arrayElemAt": ["$orderDetails.movieName", 0] }, null] }, null] }, 1, 0]
}
}}
])
答案 1 :(得分:0)
您是否尝试过使用类型检查使用{$ type:10}查找空值?
直接来自documentation:
类型检查
{item:{$ type:10}}查询仅与包含以下内容的文档匹配 值为零的项目字段;即项目字段的值 是BSON类型为Null(类型号为10):
答案 2 :(得分:0)
以下查询可以为我们提供预期的输出:
db.collection.aggregate([
{
$project:{
"OrderExists":{
$cond:[
{
$ne:[
{
$arrayElemAt: ["$orderDetails.movieName", 0]
},
undefined
]
},
1,
0
]
}
}
}
]).pretty()
数据集:
{
"_id" : ObjectId("5d837db4fb35a835fbd8638f"),
"code" : "TICKET1234",
"orderDetails" : [
{
"cost" : 150,
"movieName" : "avengers"
}
]
}
{
"_id" : ObjectId("5d837db4fb35a835fbd86390"),
"code" : "TICKET1235",
"orderDetails" : [ ]
}
输出:
{
"_id" : ObjectId("5d837db4fb35a835fbd8638f"),
"OrderExists" : 1
}
{
"_id" : ObjectId("5d837db4fb35a835fbd86390"),
"OrderExists" : 0
}
答案 3 :(得分:0)
在mongoshell中的另一种方法是:
db.getCollection('nestedstuff').find({'mainObj.level1.level2.level3.seekObj':{$elemMatch:{'propertyToFind':{$exists:true}}}}).count()