我想你的文件是这样的:
{ "_id" : ObjectId("55c87313fc92af6b6b2f9497"), "name" : "abc", "age" : "", "city" : "delhi" }
{ "_id" : ObjectId("55c87314fc92af6b6b2f9498"), "name" : "abc", "age" : "", "city" : "delhi" }
{ "_id" : ObjectId("55c87314fc92af6b6b2f9499"), "name" : "abc", "age" : "", "city" : "delhi" }
{ "_id" : ObjectId("55c87319fc92af6b6b2f949a"), "name" : "abc", "age" : 2, "city" : "delhi" }
{ "_id" : ObjectId("55c8731cfc92af6b6b2f949b"), "name" : "abc", "age" : 3, "city" : "delhi" }
{ "_id" : ObjectId("55c87320fc92af6b6b2f949c"), "name" : "abc", "age" : 4, "city" : "delhi" }
{ "_id" : ObjectId("55c87324fc92af6b6b2f949d"), "name" : "abc", "city" : "delhi" }
{ "_id" : ObjectId("55c87325fc92af6b6b2f949e"), "name" : "abc", "city" : "delhi" }
{ "_id" : ObjectId("55c87326fc92af6b6b2f949f"), "name" : "abc", "city" : "delhi" }
这里我想age 类型是Double。
您需要使用$exists 和$type 运算符。第一个过滤存在age 的文档,后者过滤其值不为空的文档。
db.collection.aggregate([
{ "$match": { "name": "abc", "age": { "$exists": true, "$type": 1 }}}
])
上面的写法更简洁:
db.collection.aggregate([
{ "$match": { "name": "abc", "age": { "$type": 1 }, "city": "delhi" }}
])
因为$type 运算符仅在字段存在 并且属于specified type 时才匹配。
如果$match 是您的聚合 中唯一的管道运算符,那么您不需要聚合。只需使用.find 方法即可。
db.collection.find({'name': 'abc', age: {$type: 1}, city: 'delhi' })
输出:
{ "_id" : ObjectId("55c87319fc92af6b6b2f949a"), "name" : "abc", "age" : 2, "city" : "delhi" }
{ "_id" : ObjectId("55c8731cfc92af6b6b2f949b"), "name" : "abc", "age" : 3, "city" : "delhi" }
{ "_id" : ObjectId("55c87320fc92af6b6b2f949c"), "name" : "abc", "age" : 4, "city" : "delhi" }