MongoDB findOne 查询取决于结果

MongoDB findOne query depends of result

假设我有 collection 的东西,记录可以是这样的:

{
    '_id' : MongoId('xxxxxx'),
    'dir' : '/home/',
    'category' : 'catname',
    'someData' : 'very important info'
}

是否可以只进行一个查询,例如collection.findOne({?????}, {'someData' : 1 }); 找到与此匹配的集合:

find by dir, if not found search for category name, if there is still nothing find collection with category name is 'default'

或者至少,我可以在此查询中说我想要第一个匹配目录,如果没有找到我想要匹配类别

collection.findOne({
    $or : [
        {'dir' : 'someCondition'},
        {'category' : 'someCondition'}
    ]
});

试试这个:

db.collection.aggregate([
    { '$project':
        {
            //Keep existing fields
            '_id':1,
            'dir':1,
            'category':1,
            'someData':1,
            //Compute some new values
            'sameDir': {'$eq':['$dir', 'SOMEDIR']},
            'sameCategory': {'$eq':['$dir', 'SOMECATEGORY']},
            'defaultCategory': {'$eq':['$dir', 'default']},
        }
    },
    { '$sort':
        {
            'sameDir': -1,
            'sameCategory': -1,
            'defaultCategory': -1,
        }
    },
    { '$limit': 1 }
])

$sort 将首先保留真实值,因此首先是目录匹配,然后是类别匹配,最后是默认类别。 $limit:1 将保持在顶部(即最佳匹配)。当然,请确保输入您自己的 SOMEDIRSOMECATEGORY 值。