Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB findOne查询取决于结果的类型_Mongodb_Nosql - Fatal编程技术网

MongoDB findOne查询取决于结果的类型

MongoDB findOne查询取决于结果的类型,mongodb,nosql,Mongodb,Nosql,假设我收集了一些东西,记录可以是这样的: { '_id' : MongoId('xxxxxx'), 'dir' : '/home/', 'category' : 'catname', 'someData' : 'very important info' } 是否可以只进行一个类似collection.findOne({????},{'someData':1})的查询;要查找与此匹配的集合,请执行以下操作: 按目录查找,如果未找到,则搜索类别名称(如果仍有) 找不

假设我收集了一些东西,记录可以是这样的:

{
    '_id' : MongoId('xxxxxx'),
    'dir' : '/home/',
    'category' : 'catname',
    'someData' : 'very important info'
}
是否可以只进行一个类似collection.findOne({????},{'someData':1})的查询;要查找与此匹配的集合,请执行以下操作:

按目录查找,如果未找到,则搜索类别名称(如果仍有) 找不到类别名称为“默认”的集合

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

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
将保留最上面的一个(即最佳匹配)。当然,一定要输入自己的
SOMEDIR
SOMECATEGORY
值。

好吧。。。执行$or查询并将逻辑放入代码中,逻辑应该在哪里!?如果我用findOne做$or,它将返回第一场比赛,所以我不知道这是我想要的。当然,逻辑应该在代码中,但在这个特殊情况下,我需要在查询中使用它。