2012-07-27 115 views
1

我有一个奇怪的问题查询mongo ..我插入一堆这样的记录;Mongodb查询间歇性失败

{ 
 "_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") 

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

我无法解释为什么这些会间歇性地无法通过查询发现。我已经在我的分片集群和我的本地实例,这只是香草开箱测试这一点。

有没有人遇到过这个?

+0

在你的mongo shell上试试这个查询并告诉我输出db.testCollection.find(Data.otherId:“5e3b3293-ec93-469a-ba46-101a1feb1155”) – user1071979 2012-07-27 21:04:05

回答

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"]}) 

(我只是测试它)

+0

如果选择器错误,为什么它会是间歇性的? – scipilot 2017-06-06 13:13:46

+0

我不知道。我对mongodb一无所知,我相信它也发生了很大的变化。 – noob 2017-06-15 14:41:12

0

我同样的问题,事实证明这与Mongo无关,而是在调用Node.js应用程序中的异步竞争条件。

我无意中使用过程风格只是一个执行的路径,以便插入和选择查询没有被在我想象中的顺序运行。插入是异步的,但是select在外部方法中运行,而不是在回调中运行。有时插入确实首先到达那里,可能是由于Node中tick机制的一些怪癖。

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