我想要运行以下内容但没有达到预期的行为。
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
我有两个问题。
Follwing查询返回空。
db.sometable.find(tags:&#39; text&#39;)
以下查询也不起作用:
db.sometable.find(tags: ["text,one"])
这也不起作用:
db.snippets.find({ tags: {$all : ["text,one"]}})
我希望在我的集合中标记数组,并根据标记列表查找文档。
以下是我的收藏中的一份文件:
{ _id: 23xagb6bo97203947005da61d,
__v: 0,
tags: [ 'text,one' ],
value: '#text #one' }
mongodb是否支持将数组作为字段值传递?或者我的代码有问题。
答案 0 :(得分:0)
我不知道您收藏中的所有文件是什么,所以我会解释为什么您只看到示例文档时看到的行为,请致电我的单文档集test
。 db.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附加指定为数组的值。