Mongodb查询间歇性失败
问题描述:
我有一个奇怪的问题查询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行。
我无法解释为什么这些会间歇性地无法通过查询发现。我已经在我的分片集群和我的本地实例,这只是香草开箱测试这一点。
有没有人遇到过这个?
答
您正在使用错误的选择器。如果您的数据是:
{
"_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"]})
(我只是测试它)
答
我同样的问题,事实证明这与Mongo无关,而是在调用Node.js应用程序中的异步竞争条件。
我无意中使用过程风格只是一个执行的路径,以便插入和选择查询没有被在我想象中的顺序运行。插入是异步的,但是select在外部方法中运行,而不是在回调中运行。有时插入确实首先到达那里,可能是由于Node中tick机制的一些怪癖。
在C#中,我认为async/await模式不太容易犯这种错误,因为更明确的await语法,它实际上导致程序外观的代码,并且不依赖于嵌套回调。但也许它仍然可能像我一样愚蠢。
在你的mongo shell上试试这个查询并告诉我输出db.testCollection.find(Data.otherId:“5e3b3293-ec93-469a-ba46-101a1feb1155”) – user1071979 2012-07-27 21:04:05