1

我在查询 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 行。

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

有没有人遇到过这个?

4

2 回答 2

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

(我刚刚测试过)

于 2012-07-27T21:08:41.523 回答
0

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

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

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

于 2017-06-16T00:04:35.103 回答