【问题标题】:Mongodb query intermittently failsMongoDB 查询间歇性失败
【发布时间】:2012-07-27 20:48:44
【问题描述】:

我在查询 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")

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

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

有人遇到过吗?

【问题讨论】:

  • 在你的 mongo shell 上尝试这个查询并告诉我输出 db.testCollection.find(Data.otherId : "5e3b3293-ec93-469a-ba46-101a1feb1155")

标签: mongodb mongodb-.net-driver


【解决方案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"]})

(我刚刚测试过)

【讨论】:

  • 选择器错误为什么会断断续续?
  • 我不知道。我对mongodb一无所知,我相信它也发生了很大变化。
【解决方案2】:

我遇到了同样的问题,结果证明它与 Mongo 无关,而是调用 Node.js 应用程序中的异步竞争条件。

我无意中将程序样式仅用于一个执行路径,因此插入和选择查询没有按照我想象的顺序运行。插入是异步的,但选择是在外部方法中运行,而不是在回调中。有时插入确实首先到达那里,大概是由于 Node 中的滴答机制的一些怪癖。

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

【讨论】:

    猜你喜欢
    • 2019-04-18
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多