Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.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
Javascript 返回有限数量的特定类型的记录,但不限制数量的其他记录?_Javascript_Php_Mongodb_Mapreduce_Aggregation Framework - Fatal编程技术网

Javascript 返回有限数量的特定类型的记录,但不限制数量的其他记录?

Javascript 返回有限数量的特定类型的记录,但不限制数量的其他记录?,javascript,php,mongodb,mapreduce,aggregation-framework,Javascript,Php,Mongodb,Mapreduce,Aggregation Framework,我有一个查询,需要返回10条“a型”记录,同时返回所有其他记录。我怎样才能做到这一点 更新:诚然,我可以用两个查询来实现这一点,但如果可能的话,我想避免这样做,因为这样会减少开销,而且可能会提高性能。我的查询已经是一个将两种记录都考虑在内的聚合查询,我只需要限制结果中一种记录的数量 更新:以下是一个突出问题的示例查询: db.books.aggregate([ {$geoNear: {near: [-118.09771, 33.89244], distanceField: "distan

我有一个查询,需要返回10条“a型”记录,同时返回所有其他记录。我怎样才能做到这一点

更新:诚然,我可以用两个查询来实现这一点,但如果可能的话,我想避免这样做,因为这样会减少开销,而且可能会提高性能。我的查询已经是一个将两种记录都考虑在内的聚合查询,我只需要限制结果中一种记录的数量

更新:以下是一个突出问题的示例查询:

db.books.aggregate([
    {$geoNear: {near: [-118.09771, 33.89244], distanceField: "distance", spherical: true}},
    {$match:    {"type": "Fiction"}},
    {$project:  {
        'title': 1,
        'author': 1,
        'type': 1,
        'typeSortOrder': 
            {$add: [
                {$cond: [{$eq: ['$type', "Fiction"]}, 1, 0]},
                {$cond: [{$eq: ['$type', "Science"]}, 0, 0]},
                {$cond: [{$eq: ['$type', "Horror"]}, 3, 0]}
        ]},
    }},
    {$sort: {'typeSortOrder'}},
    {$limit: 10}
])

db.books.aggregate([
    {$geoNear: {near: [-118.09771, 33.89244], distanceField: "distance", spherical: true}},
    {$match:    {"type": "Horror"}},
    {$project:  {
        'title': 1,
        'author': 1,
        'type': 1,
        'typeSortOrder': 
            {$add: [
                {$cond: [{$eq: ['$type', "Fiction"]}, 1, 0]},
                {$cond: [{$eq: ['$type', "Science"]}, 0, 0]},
                {$cond: [{$eq: ['$type', "Horror"]}, 3, 0]}
        ]},
    }},
    {$sort: {'typeSortOrder'}},
    {$limit: 10}
])

db.books.aggregate([
    {$geoNear: {near: [-118.09771, 33.89244], distanceField: "distance", spherical: true}},
    {$match:    {"type": "Science"}},
    {$project:  {
        'title': 1,
        'author': 1,
        'type': 1,
        'typeSortOrder': 
            {$add: [
                {$cond: [{$eq: ['$type', "Fiction"]}, 1, 0]},
                {$cond: [{$eq: ['$type', "Science"]}, 0, 0]},
                {$cond: [{$eq: ['$type', "Horror"]}, 3, 0]}
        ]},
    }},
    {$sort: {'typeSortOrder'}},
    {$limit: 10}
])
我希望在一个查询中返回所有这些记录,但将任何类别的类型限制为最多10个。
我意识到当查询像这样被分解时,typeSortOrder不需要是有条件的,当查询是一个查询时,我就有了它,最初(我想回到这里)。

我认为目前(2.6)不可能用一个聚合管道来实现。很难给出一个确切的理由来解释为什么不能,但基本上聚合管道执行文档流的转换,一次一个文档。管道中没有意识到流本身的状态,这就是您需要确定的,您已经达到了A、B等的限制,并且需要删除更多相同类型的文档<代码>$group将多个文档放在一起,并允许它们的字段值合计影响生成的组文档(
$sum
$avg
等)。也许这有点道理,但它不一定严格,因为可以添加一些简单的操作,以便根据类型进行限制,例如,向
$push x
累加器添加一个
$group
,该累加器仅在被推送到的数组的元素少于x时才推送值


即使我有办法做到这一点,我还是建议只做两次聚合。保持简单。

这是MongoDB不支持的子查询/连接的经典案例。所有连接和类似子查询的操作都需要在应用程序逻辑中实现。因此,多个查询是您的最佳选择。若您有一个关于类型的索引,那个么多查询方法的性能应该很好

或者,您可以编写一个聚合查询,减去类型匹配和限制子句,然后在应用程序逻辑中处理流以限制每种类型的文档。
对于大型结果集,这种方法的性能较低,因为文档可能以随机顺序返回。然后,您的限制逻辑将需要遍历整个结果集。

我想您可以在游标上使用cursor.limit()来指定游标将返回的最大文档数。limit()类似于SQL数据库中的limit语句。 在从数据库检索任何文档之前,必须对光标应用limit()

游标中的limit函数可用于限制查找中的记录数

我想这个例子应该有帮助:

var myCursor = db.bios.find( );

db.bios.find().limit( 5 )
问题
这里的结果并非不可能,但也可能不切实际。一般注意事项是,您不能“切片”数组或以其他方式“限制”推送到一个数组上的结果量。每个“类型”执行此操作的方法本质上是使用数组

“不切实际”部分通常是关于结果的数量,当“分组”时,太大的结果集会破坏BSON文档的限制。但是,我将考虑一些关于你的“地理搜索”的建议,以及最终返回每个“类型”最多10个结果的最终目标。

原则

首先考虑和理解这个问题,让我们看一个简化的“数据集”和从每个类型返回“前2个结果”所需的流水线代码:

{“title”:“title 1”,“author”:“author 1”,“type”:“Fiction”,“distance”:1},
{“标题”:“标题2”,“作者”:“作者2”,“类型”:“小说”,“距离”:2},
{“标题”:“标题3”,“作者”:“作者3”,“类型”:“小说”,“距离”:3},
{“标题”:“标题4”,“作者”:“作者4”,“类型”:“科学”,“距离”:1},
{“标题”:“标题5”,“作者”:“作者5”,“类型”:“科学”,“距离”:2},
{“标题”:“标题6”,“作者”:“作者6”,“类型”:“科学”,“距离”:3},
{“标题”:“标题7”,“作者”:“作者7”,“类型”:“恐怖”,“距离”:1}
这是数据的简化视图,在某种程度上代表了初始查询后文档的状态。现在是如何使用聚合管道为每个“类型”获取“最接近”的两个结果的技巧:

db.books.aggregate([
{“$sort”:{“类型”:1,“距离”:1},
{“$组”:{
“_id”:“$type”,
"1": { 
“$first”:{
“\u id”:“$\u id”,
“标题”:“$title”,
“作者”:“$author”,
“距离”:“$distance”
}
},
“书籍”:{
“$push”:{
“\u id”:“$\u id”,
“标题”:“$title”,
“作者”:“$author”,
“距离”:“$distance”
}
}
}},
{“$project”:{
"1": 1,
“书籍”:{
“$cond”:[
{“$eq”:[{“$size”:“$books”},1]},
{“$literal”:[false]},
“$books”
]
}
}},
{“$unwind”:“$BOOTKS”},
{“$project”:{
"1": 1,
"书":一,,
“seen”:{“$eq”:[“$1”,“$books”]}
}},
{“$sort”:{“_id”:1,“seen”:1},
{“$组”:{
“\u id”:“$\u id”,
“1”:{“$first”:“$1”},
“2”:{“$first”:“$books”},
“书籍”:{
“$push”:{
“$cond”:[{“$not”:“$seen”},$books”,false]
}
}
}},
{“$project”:{
"1":