查询无法在 MongoDB 中查找标签数组

Query not working for finding array of tags in MongoDB

我正在尝试 运行 以下但没有得到预期的行为。

var searchQuery = {
    'one' : oneQuery,
    'two' : twoQuery,
    'three' : threeQuery,
    'four' : fourQuery
};

for(query in searchQuery){
    var tags = ['text'];
    tags.push(query);
    SomeTable.update({ text : { $regex: searchQuery[query], $options: 'xi' }},
        {$addToSet: {tags: tags}}, {multi: true});

    SomeTable.find({ tags : tags })
        .exec(function(err, rows) {
            if (err) return console.error(err);

            console.log('Size of result for ' + query + ': ' + rows.length);
            for(var i=0; i < rows.length; i++) {
                console.dir(rows[i].tags);
            }
        });
}

这会打印:

Size of result for one: 1
["text,one"]
Size of result for one: 2
["text,two"]
["text,two"]
Size of result for one: 0
Size of result for one: 0

我有两个问题。

  1. 后续查询returns为空。

    db.sometable.find(标签:'text')

以下查询也不起作用:

db.sometable.find(tags: ["text,one"]) 

这也不起作用:

db.snippets.find({ tags: {$all : ["text,one"]}})

我希望在我的 collection 中添加标签数组,并根据标签列表找到文档。

  1. 这里是否有使用闭包的范围。 (PS 我是 javascript 的新手)

更新

这是我的一份文件 collection:

{ _id: 23xagb6bo97203947005da61d,
  __v: 0,
  tags: [ 'text,one' ],
  value: '#text #one' }

更新 2

mongodb是否支持将数组作为字段值传递?或者我的代码有问题。

我不知道您的集合中的所有文档是什么,所以我将解释为什么您会看到仅在示例文档中看到的行为,调用我的单文档集合 testdb.test.find({ "tags" : "text" }) 不匹配,因为示例文档的 tags 字段不包含数组中的值 "text";它包含值 "text,one",这是一个不同的字符串。也许您的意思是将标签数组的值设置为 ["text", "one"],或者您想使用 text search?查询

db.test.find({ "text" : ["text, one"] })

db.test.find({ "text" : { "$all" : ["text, one"] } })

确实匹配那个样本文件 - 我想你一定是犯了一些错误。

对 mongodb $addToSet 的少量阅读帮助我解决了这里的问题。

MongoDB $addToSet 的文档说

"If the value is an array, $addToSet appends the whole array as a single element. To add each element of the value separately, use the $each modifier with $addToSet."

因此,按如下方式使用 $each 在这里有效:

{$addToSet: {tags: {$each: tags}}}

我应该把更新语句写成这样:

SomeTable.update({ text : { $regex: searchQuery[query], $options: 'xi' }},
        {$addToSet: {tags: {$each: tags}}}, {multi: true});

这将阻止 MongoDB 附加指定为数组的值。