查询无法在 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
我有两个问题。
后续查询returns为空。
db.sometable.find(标签:'text')
以下查询也不起作用:
db.sometable.find(tags: ["text,one"])
这也不起作用:
db.snippets.find({ tags: {$all : ["text,one"]}})
我希望在我的 collection 中添加标签数组,并根据标签列表找到文档。
- 这里是否有使用闭包的范围。 (PS 我是 javascript 的新手)
更新
这是我的一份文件 collection:
{ _id: 23xagb6bo97203947005da61d,
__v: 0,
tags: [ 'text,one' ],
value: '#text #one' }
更新 2
mongodb是否支持将数组作为字段值传递?或者我的代码有问题。
我不知道您的集合中的所有文档是什么,所以我将解释为什么您会看到仅在示例文档中看到的行为,调用我的单文档集合 test
。 db.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 附加指定为数组的值。
我正在尝试 运行 以下但没有得到预期的行为。
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
我有两个问题。
后续查询returns为空。
db.sometable.find(标签:'text')
以下查询也不起作用:
db.sometable.find(tags: ["text,one"])
这也不起作用:
db.snippets.find({ tags: {$all : ["text,one"]}})
我希望在我的 collection 中添加标签数组,并根据标签列表找到文档。
- 这里是否有使用闭包的范围。 (PS 我是 javascript 的新手)
更新
这是我的一份文件 collection:
{ _id: 23xagb6bo97203947005da61d,
__v: 0,
tags: [ 'text,one' ],
value: '#text #one' }
更新 2
mongodb是否支持将数组作为字段值传递?或者我的代码有问题。
我不知道您的集合中的所有文档是什么,所以我将解释为什么您会看到仅在示例文档中看到的行为,调用我的单文档集合 test
。 db.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 附加指定为数组的值。