猫鼬查找对象,其中数组字段包含数组中的所有值

时间:2018-08-04 22:44:37

标签: node.js mongodb mongoose

我有一个看起来像这样的对象:

let SentenceSchema = new mongoose.Schema({
  sentence: { type: String, required: true },
  language: { type: String, required: true },
  tokens: [{ type: String }]
});

我有一个看起来像这样的数组

let words = ['i', 'love', 'you', 'me', 'cheese', 'and'];

我想找到tokens all 出现在此数组中的所有对象。这就是我已经尝试过的:

Sentence.find({ tokens: { $all: words } });

仅返回一个结果i love you me and cheese,而我也希望它返回其他结果,例如i love youyou love me

如果我将运算符从$all更改为$in,那么我得到的结果会超出预期,因为类似cheese is a food that i love的东西也会被匹配。

我只是想返回所有包含以上单词数组中所有tokens字符串的句子。这样可能吗?

1 个答案:

答案 0 :(得分:1)

在这种情况下,我似乎需要做的很奇怪,但是您必须对ninelemMatch,然后再对not进行操作才能达到目标。

查询如下:

db.collection.find({
  tokens: {
    "$not": {
      "$elemMatch": {
        $nin: [
          "i",
          "love",
          "you",
          "me",
          "cheese",
          "and"
        ]
      }
    }
  }
})

使用此输入:

[
  {
    _id: 1,
    tokens: [
      "i",
      "love",
      "you",
      "me",
      "cheese",
      "and"
    ]
  },
  {
    _id: 2,
    tokens: [
      "i",
      "love",
      "cheese",
      "and"
    ]
  },
  {
    _id: 3,
    tokens: [
      "love",
      "you",
      "me",
      "soap"
    ]
  }
]

它将返回正确的结果:

[
  {
    "_id": 1,
    "tokens": [
      "i",
      "love",
      "you",
      "me",
      "cheese",
      "and"
    ]
  },
  {
    "_id": 2,
    "tokens": [
      "i",
      "love",
      "cheese",
      "and"
    ]
  }
]

如您所见here