MongoDB:如何search数组除了特定值之外什么都不包含?

假设我有以下一组数据:

{_id: "something", array: ["a", "b", "c", "d"]}, // 1 {_id: "something", array: ["a", "b", "d"]}, // 2 {_id: "something", array: ["b", "c", "d"]}, // 3 {_id: "something", array: ["a", "d"]}, // 4 {_id: "something", array: ["a", "b"]}, // 5 {_id: "something", array: ["d"]}, // 6 {_id: "something", array: ["c"]}, // 7 {_id: "something", array: []}, // 8 {_id: "something"}, // 9 {_id: "something", array: ["a", "b", "c", "d", "e", "f", etc...]}, // 10 

我想要查找数组中除“a”和“d”以外没有任何内容的文档。 所以需要的输出应该是数据的第四,第六,第八和第九。 我应该如何编写查询?

$ in和$ nin都不能得到我想要的(因为使用$ nin将要求我在查询中input太多的可能性)。

另一个说明,我正在使用MongoDB的MongoDB v3.2。

接收答案后附加注释:
– PS在这个例子中,“a”和“d”只是2排除的例子。 但是在实际实现中,这是一个由用户select插入的值。 所以它不限于2个排除,其可以在以后是“b”,“c”和“d”,甚至更多基于用户input的值。

以下将起作用:

 db.examples.aggregate({ $addFields: { // add a new field that holds... diff: { // ...all array values that are outside your allowed values $setDifference: [ "$array", [ "a", "d" ] ] } } }, { $match: { // and use the newly added field to filter the result set $or: [ { diff: null }, { diff: [] } ] } }) 

一个快速和肮脏的解决scheme将是:

 use stackoverflow-example db.examples.insertMany([{text: "something", array: ["a", "b", "c", "d"]}, // 1) {text: "something", array: ["a", "b", "d"]}, // 2 {text: "something", array: ["b", "c", "d"]}, // 3 {text: "something", array: ["a", "d"]}, // 4 {text: "something", array: ["a", "b"]}, // 5 {text: "something", array: ["d"]}, // 6 {text: "something", array: ["c"]}, // 7 {text: "something", array: []}, // 8 {text: "something"}, // 9 {text: "something", array: ["a", "b", "c", "d", "e", "f"]}] ) db.examples.find({ $or: [{ $and: [{ array: 'a' }, { array: 'd' }, {array: { $size: 2 }}] }, { $and: [{ array: 'a' }, {array: { $size: 1 }}] }, { $and: [{ array: 'd' }, {array: { $size: 1 }}] }, { array: { $size: 0 } }, { array: { $exists: false } }] }) 

这将返回所需的对象。 我相信可以find一个更好的解决scheme