有没有办法匹配Mongo中数据库文档数组中的每个元素?
例如,使用文档:
{
Stuff: ['chicken', 'stock']
}
是否存在以某种方式作为输入的查询[' chicken',' flavored',' stock']并返回此文档,但不会#39; t只输入[' chicken']?
答案 0 :(得分:0)
实际上,文本索引在这里应该有用,因为它是OR匹配,可以按分数排序,这样可以很容易地找到具有最佳匹配的结果。找到的搜索词越多,得分越高。此外,文本搜索提供词干和停止词。在给出的例子中,这意味着“鸡”和“鸡”会给出相同的结果。
db.yourCollection.ensureIndex({"Stuff":"text"})
db.yourCollection.find({ $text: { $search:"chicken stock", $language:"en" } },{ score: { $meta: "textScore" } })).sort( { score: { $meta: "textScore" } } ).limit(whatEverYouDeemAppropriateInt)
有关详细信息,请参阅the MongoDB docs about Text Indexes。
答案 1 :(得分:0)
你可以通过组合多个运算符来执行此操作,以执行双重否定,这有点难以记录在你的脑海中(至少对我而言!):
// Find the docs where Stuff only contains 'chicken' or 'stock' elements
db.test.find({Stuff: {$not: {$elemMatch: {$nin: ['chicken', 'stock']}}}})
所以$elemMatch
$nin
找到了文档,Stuff
数组的单个元素不在字符串集中,然后是父$not
反转匹配以返回与任何元素不匹配的所有文档。
从以下文档开始:
db.test.insert([
{Stuff: ['chicken']},
{Stuff: ['chicken', 'stock']},
{Stuff: ['chicken', 'flavored', 'stock']}
])
以上查询返回:
{
"_id": ObjectId("53dec1c5393fa0461f92334c"),
"Stuff": [
"chicken"
]
}
{
"_id": ObjectId("53dec1c5393fa0461f92334d"),
"Stuff": [
"chicken",
"stock"
]
}
但请注意,这也将返回Stuff
缺失或没有元素的文档。要在限定符中排除$and
所需的内容,以确保Stuff
至少包含一个元素:
db.test.find({$and: [
{Stuff: {$not: {$elemMatch: {$nin: ['chicken', 'stock']}}}},
{'Stuff.0': {$exists: true}}
]})