PyMongo如果值不是NaN,则仅包括文档中的字段

时间:2016-10-03 16:43:29

标签: python mongodb insert pymongo nan

我需要使用PyMongo将大量数据插入到我的MongoDB数据库中。我所拥有的数据目前存储在平面文件中并且是稀疏的(即,许多单独的值是NaN)。在Mongo DB中,如果值为NaN,我想不插入字段,但我不知道该怎么做(我应该指出我是MongoDB和Python的新手)。

我的插件启动看起来像这样

            strategy.insert_many([
            {
                "strategyId": strategyInfo[stratIndex][ID],
                "strategyName": strategyInfo[stratIndex][NAME],
                "date": dates[i],
                "time": thisTime,
                "aum": stratAum[i],
                "return":0.0,
                "commission":0.0,
                "slippage":0.0,
                "basket":[{
                    "assetId": assets[m][ASSETID],
                    "order": orders[i, m],
                    "expiry": expiry[i, m],
                    "price": prices[i, m],
                    "ePrice": eprices[i, m]     <<<Don't include line if eprices[i,m] is a NaN
                }
                    for m in range(len(assets))
                ]
            }
        ], False)

使用math.isnan()查看我的某个值是否为NaN很容易,但我无法弄清楚如果这是一个空白案件。

1 个答案:

答案 0 :(得分:0)

  

使用math.isnan()检查我的某个值是否为NaN很容易,但如果是这种情况,我无法弄清楚如何将整个字段留空。

根据您的示例代码,您可以执行以下操作:

# Create a strategy document. 
# This is inside of a loop where variable `i` is known, similar to your example. 
doc = {
  "strategyId": strategyInfo[stratIndex][ID],
  "strategyName": strategyInfo[stratIndex][NAME],
  "date": dates[i],
  "time": thisTime,
  "aum": stratAum[i],
  "return":0.0,
  "commission":0.0,
  "slippage":0.0
}
baskets = []
for m in range(len(assets)):
    basket = {
        "assetId": assets[m][ASSETID],
        "order": orders[i, m],
        "expiry": expiry[i, m],
        "price": prices[i, m],
    }
    if not math.isnan(eprice[i, m]):
        basket["ePrice"] = eprice[i, m]
    baskets.append(basket)

# You can also add a filter here to make sure `baskets` array is not null.
doc["basket"] = baskets
docs.append(doc)

这基本上将制作文档和数据库插入分开。

然后您可以使用insert_many()

strategy.insert_many(docs, False)

您还可以将insert_many包装在try / except中以检测数据库插入错误,这应该是与文档创建错误不同的错误处理。