我有一个看起来像这样的对象:
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 you
和you love me
。
如果我将运算符从$all
更改为$in
,那么我得到的结果会超出预期,因为类似cheese is a food that i love
的东西也会被匹配。
我只是想返回所有包含以上单词数组中所有tokens
字符串的句子。这样可能吗?
答案 0 :(得分:1)
在这种情况下,我似乎需要做的很奇怪,但是您必须对nin
做elemMatch
,然后再对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。