Mongodb查询间歇性失败

时间:2012-07-27 20:48:45

标签: mongodb mongodb-.net-driver

我有一个奇怪的问题,查询mongo ..我插入了一堆像这样的记录;

{
  "_id" : "1f0aad54-85ef-446c-a02b-76bb0235e49c",
  "internalId" : new BinData(3, "VP0LH++FbESgK3a7AjXknA=="),
  "Data" : [
        ["otherId", "5e3b3293-ec93-469a-ba46-101a1feb1155"], 
        ["test", "test"], 
        ["test2", "test2"]
  ]
}

然后我做一个简单的查询;

db.testCollection.find("Data.otherId" : "5e3b3293-ec93-469a-ba46-101a1feb1155")

另一个是.net guid.ToString() - 几个随机的显然..有时这些返回。有时候他们没有。 db.find()显示它们,但显式查询它似乎随机返回0行。

我无法解释为什么查询会间歇性地找不到这些内容。我已经在我的分片群集和我的本地实例上测试了这个,这只是开箱即用的香草。

有没有人遇到过这个?

2 个答案:

答案 0 :(得分:1)

你使用了错误的选择器。如果您的数据是:

{
  "_id" : "1f0aad54-85ef-446c-a02b-76bb0235e49c",
  "internalId" : new BinData(3, "VP0LH++FbESgK3a7AjXknA=="),
  "Data" : {
        "otherId" "5e3b3293-ec93-469a-ba46-101a1feb1155", 
        "test": "test",
        "test2": "test2"
  }
}

该选择器是正确的,但你有数组,所以你应该使用这个选择器:

db.testCollection.find({"Data.0" : ["otherId","5e3b3293-ec93-469a-ba46-101a1feb1155"]})

(我刚试过它)

答案 1 :(得分:0)

我遇到了同样的问题,结果发现它与Mongo无关,但在调用Node.js应用程序时是一个异步竞争条件。

我不知不觉地只使用一个程序样式来执行一条路径,因此insert和select查询没有按照我想象的顺序运行。插入是异步的,但是选择是在外部方法中运行,而不是在回调中。有时插入确实首先到达那里,可能是由于Node中的一些嘀嗒机制的怪癖。

在C#中我认为async / await模式不太容易出现这种错误,因为更明确的await语法,实际上导致了程序化的代码,并且不依赖于嵌套回调。但也许它仍然可能像我一样愚蠢。