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

时间:2015-02-02 17:55:02

标签: javascript arrays mongodb closures

我想要运行以下内容但没有达到预期的行为。

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. Follwing查询返回空。

    db.sometable.find(tags:&#39; text&#39;)

  2. 以下查询也不起作用:

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

    这也不起作用:

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

    我希望在我的集合中标记数组,并根据标记列表查找文档。

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

      以下是我的收藏中的一份文件:

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

      更新2

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

2 个答案:

答案 0 :(得分:0)

我不知道您收藏中的所有文件是什么,所以我会解释为什么您只看到示例文档时看到的行为,请致电我的单文档集testdb.test.find({ "tags" : "text" })不匹配,因为示例文档的tags字段在数组中不包含值"text";它包含值"text,one",这是一个不同的字符串。也许您认为tags数组的值为["text", "one"],或者您想使用text search?查询

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

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

匹配该示例文档 - 我认为你肯定犯了一些错误。

答案 1 :(得分:0)

很少阅读mongodb $ addToSet帮我解决了这个问题。

$ addToSet的MongoDB文档说

  

“如果值是一个数组,$ addToSet将整个数组附加为a   单个元素。要分别添加值的每个元素,请使用   每个修饰符$ $ addToSet。“

所以,使用$ each如下所示:

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

我应该按如下方式编写更新声明:

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

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