【问题标题】:Query not working for finding array of tags in MongoDB查询不适用于在 MongoDB 中查找标签数组
【发布时间】:2015-02-02 17:55:02
【问题描述】:

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

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

    db.sometable.find(tags: 'text')

以下查询也不起作用:

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

这也不起作用:

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

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

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

更新

这是我收藏的一份文件:

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

更新 2

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

【问题讨论】:

  • 首先只使用 mongo shell 命令来缩小范围。请注意,mongo 将在没有特殊处理的数组中找到一个元素。 IE。查找({标签:“一个”})。如果你想找到一个完整的匹配然后使用 {$all : []} 你有。不确定“文本”是什么意思。预期的文件是什么
  • 'text' 只是文档的另一个标签。我已经尝试了所有我在 mongo shell 和 nodejs 中都知道的组合。
  • 你能打印一份记录/文件吗
  • 如果数组名是文本则 .find({text: "one"})
  • 我正在用我收藏的一份文档更新问题。数组名称是“标签”。 'tags' 数组包含一个元素 'text' 和其他元素。

标签: javascript arrays mongodb closures


【解决方案1】:

我不知道您的集合中的所有文档是什么,所以我将说明为什么您会看到仅给出示例文档的行为,调用我的单文档集合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"] } })

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

【讨论】:

  • 我同意,出了点问题。我怀疑,这可能是因为在 update() 中使用了 'tags' 数组。但不确定。
【解决方案2】:

对 mongodb $addToSet 的一点阅读帮助我找出了这里的问题。

$addToSet 的 MongoDB 文档说

"如果值是一个数组,$addToSet 将整个数组追加为一个 单个元素。要分别添加值的每个元素,请使用 带有 $addToSet 的 $each 修饰符。”

因此,在这里使用 $each 如下:

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

我应该把更新语句写成如下:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2020-09-14
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多