【发布时间】:2020-03-17 16:44:51
【问题描述】:
我有一个分片集合,其中 _id 和公司字段上的分片键。 所以一个文档看起来像:
{
"_id": ObjectId("5e69a25624aa9a09d6a9e684"),
"company": "ABC",
"name": "Joe",
"address": "123 street"
},
{
"_id": ObjectId("5e69a25624aa9a09d6a9e683"),
"company": 4,
"name": "Fred",
"address": "123 street"
},
有些公司字段是数字 ID,有些是字符串。
我想写一个这样的查询:
db.people.findAndModify({"query": {"_id": ObjectId("5e69a25624aa9a09d6a9e684"), "company": {"$in": ["ABC", "4", 4]}}, "update": {"$set": {"address": "433 street"}}})
有些是字符串,有些是数字的原因是,公司 ID 的旧格式是数字,但随着最近的更改,它也可能是字符串。另外,在查询时,我不知道我需要使用哪种格式。
上述查询失败并出现类似这样的错误
QUERY [js] uncaught exception: Error: findAndModifyFailed failed: {
"ok" : 0,
"errmsg" : "Query for sharded findAndModify must contain the shard key",
"code" : 61,
"codeName" : "ShardKeyNotFound",
"$clusterTime" : {
"clusterTime" : Timestamp(1584461817, 1),
"signature" : {
"hash" : BinData(0,"ud27faacC2Jn3bYt1w0MNMr2MD0="),
"keyId" : NumberLong("6785743810203746305")
}
},
"operationTime" : Timestamp(1584461817, 1)
}
我正在使用 java mongo 驱动程序,这似乎迫使我使用findAndModify 函数。
如何在公司字段中使用$in 查询集合?
当我在命令行上编写查询时,我可以看到,如果我使用 updateMany 或 updateOne 一切正常,有没有办法让 java mongo 驱动程序使用其中一种方法而不是 findAndModify?
【问题讨论】:
标签: mongodb-query mongo-java-driver