匹配Mongo中数据库文档数组中的每个元素

时间:2014-07-04 16:49:08

标签: arrays mongodb

有没有办法匹配Mongo中数据库文档数组中的每个元素?

例如,使用文档:

{
    Stuff: ['chicken', 'stock']
}

是否存在以某种方式作为输入的查询[' chicken',' flavored',' stock']并返回此文档,但不会#39; t只输入[' chicken']?

2 个答案:

答案 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}}
]})