小编Ste*_*nMK的帖子

MongoDB范围查询中$ lt和$ gt的顺序

今天我注意到,给出了$ lt和$ gt运算符的顺序似乎在MongoDB 2.0.2中很重要.

我有一个游戏数据库."player"是表示两个玩家的两个字符串的数组,"endedAtMS"是游戏结束时的时间戳.我创建了这个索引:

db.games.ensureIndex({player:1,endedAtMS:-1})
Run Code Online (Sandbox Code Playgroud)

为了获得30个在特定时间范围内完成的游戏,在游戏完成时排序,我这样做:

db.games.find({ "player" : "Stefan" , 
                "endedAtMS" : { "$lt" : 1321284969946 , 
                                "$gt" : 1301284969946}}).
         sort({endedAtMS:-1}).
         limit(30).
         explain()

{
    "cursor" : "BtreeCursor player_1_endedAtMS_-1",
    "nscanned" : 30,
    "nscannedObjects" : 30,
    "n" : 30,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : {
        "player" : [
            [
                "Stefan",
                "Stefan"
            ]
        ],
        "endedAtMS" : [
            [
                1321284969946,
                -1.7976931348623157e+308
            ]
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

一切似乎都很好.但是当我在上面的查询中更改$ lt和$ gt的顺序时,我得到了这个:

db.games.find({ "player" …
Run Code Online (Sandbox Code Playgroud)

mongodb

18
推荐指数
1
解决办法
3万
查看次数

Python:select()不会发出来自管道的所有输入信号

我正在尝试使用Python加载外部命令行程序并通过管道与它通信.progam通过stdin获取文本输入并生成文本输出到stdout.使用select()进行通信应该是异步的.

问题是,并非所有程序输出都在select()中发出信号.通常最后一行或两行不发信号.如果select()返回超时并且我试图从管道中读取,则readline()会立即返回程序发送的行.见下面的代码.

程序不缓冲输出并以文本行发送所有输出.到目前为止,通过许多其他语言和环境的管道连接到程序已经很好.

我在Mac OSX 10.6上尝试过Python 3.1和3.2.

import subprocess
import select

engine = subprocess.Popen("Engine", bufsize=0, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
engine.stdin.write(b"go\n")
engine.stdin.flush()

while True:
    inputready,outputready,exceptready = select.select( [engine.stdout.fileno()] , [], [], 10.0)

    if (inputready, outputready, exceptready) == ([], [], []):
        print("trying to read from engine anyway...")
        line = engine.stdout.readline()
        print(line)

     for s in inputready:
        line = engine.stdout.readline()
        print(line)
Run Code Online (Sandbox Code Playgroud)

python select pipe

10
推荐指数
1
解决办法
3766
查看次数

在 MongoDB 的聚合框架中对数组进行切片

我将游戏结果保存在 MongoDB 中,并希望计算每个玩家 3 个最佳结果的总和。

借助聚合框架,我可以从已完成游戏的数据库中构建以下中间管道结果(下面的每个玩家都已完成 5 场游戏并给出分数):

    {
        "_id" : "Player1",
        "points" : [ 324, 300, 287, 287, 227]
    },
    {
        "_id" : "Player2",
        "points" : [ 324, 324, 300, 287, 123]
    }
Run Code Online (Sandbox Code Playgroud)

现在我需要总结每个玩家的三个最佳值。我能够对数组进行排序,因此这里也可以只获取每个数组的前 3 个元素,以便在下一个管道步骤中构建数组的总和。

如果我只需要一名玩家的结果,$limit 就可以正常工作。我还尝试使用 $slice 但这似乎在聚合框架中不起作用。

那么如何获得每个玩家的三个最佳成绩的总和呢?

mongodb

5
推荐指数
1
解决办法
2052
查看次数

标签 统计

mongodb ×2

pipe ×1

python ×1

select ×1