【问题标题】:MongoDb query sharded collection with $inMongoDb 使用 $in 查询分片集合
【发布时间】: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 查询集合? 当我在命令行上编写查询时,我可以看到,如果我使用 updateManyupdateOne 一切正常,有没有办法让 java mongo 驱动程序使用其中一种方法而不是 findAndModify

【问题讨论】:

    标签: mongodb-query mongo-java-driver


    【解决方案1】:

    发布后我又玩弄了一些,发现我可以更改我的 java 代码

    metaDataCollection.updateMany(query, set, options);

    metaDataCollection.bulkWrite(Arrays.asList(new UpdateManyModel<>(query, set, options)));

    这似乎解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 2013-01-23
      • 2013-08-31
      • 2018-12-15
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      相关资源
      最近更新 更多