Mongodb更新查询返回'无法将$ pull应用于非数组值'

时间:2016-10-18 15:21:45

标签: java pull mangodb

我有一个名为Entity&的集合。下面是它的架构

    Entity {
        Owner {
            id
        }

        Tags [
             {id : 
              name : }
             {id : 
              name : }
        ]
    }

我正在尝试使用匹配的所有者ID&标记ID然后从实体中删除标记

    BasicDBObject query = new BasicDBObject("Tags.id", tagId).append("Owner.id", ownerId);

    BasicDBObject updQuery = new BasicDBObject("$pull", 
            new BasicDBObject("Tags", new BasicDBObject("id", tagId)));
    updQuery.update(query, updQuery, true);

其中实体是MongoJackDaoImpl实例。

当我尝试提取与标记ID&匹配的空结果时所有者ID,我得到以下异常

com.mongodb.WriteConcernException: Write failed with error code 16836 and error message 'Cannot apply $pull to a non-array value'
    at com.mongodb.operation.BaseWriteOperation.convertBulkWriteException(BaseWriteOperation.java:239)

有没有办法在更新查询中检查空结果以避免错误?

1 个答案:

答案 0 :(得分:0)

发生错误是因为UPSERT设置为false,因为当select select查询返回空记录时,更新失败。

通过在BasicDBObject构造函数

中将UPSERT boolean设置为true来修复上面的代码
BasicDBObject updQuery = new BasicDBObject("$pull", 
            new BasicDBObject("Tags", new BasicDBObject("id", tagId)));
    updQuery.update(query, updQuery, true, true);