删除值不是数组的文档

时间:2018-06-28 18:43:09

标签: mongodb

似乎mongodb允许使用相同的语法删除值是单个值的文档,并且只要该值出现在集合中就可以删除它:

// tsconfig.json .. other rules "exclude": [ "**/__mocks__/" ] // src/global.d.ts declare namespace MySpace { export type MyType = { id: string; } } // src/__mocks__/item.ts // Error on 'MySpace': Cannot find namespace 'MySpace` const item: MySpace.MyType = { id: 'myId' };

可以同时影响db.SomeCollection.deleteMany({UserId: 12345});{UserId: 12345}

我知道这种架构并不理想;我们使用单数{UserId: [12345, 67895, 87897]}道具来表示单个id int和一个int数组。但是,如果您不知所措,我继承了一个数据库,该数据库利用了mongodb的动态特性。

执行UserId查询并指定仅删除值是单个整数的文档,最安全的方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用$type运算符检查字段类型,但是在这种情况下不是很明显。您无法检查UserId是否为double类型,因为MongoDB会指出双精度数组也是双精度(更多here)。因此,您需要反转逻辑并检查您要删除的文档是否不是数组(类型4):

db.SomeCollection.deleteMany({ $and: [ { UserId: 12345 }, { UserId: { $not: { $type: 4 } } } ] })