假设我们有
post1.tags = [ '1', '2', '3' ];
post2.tags = [ '2', '4', '5' ];
post3.tags = [ '1', '3', '4' ];
post4.tags = [ '1', '3', '4', '5', '6' ];
我正在尝试查找包含 2 个或更多给定标签 ['1'、'3'、'5'] 的帖子。结果应该是 post1、post3 和 post4。如何编写一个 mongodb 查询来实现这一点?
假设我们有
post1.tags = [ '1', '2', '3' ];
post2.tags = [ '2', '4', '5' ];
post3.tags = [ '1', '3', '4' ];
post4.tags = [ '1', '3', '4', '5', '6' ];
我正在尝试查找包含 2 个或更多给定标签 ['1'、'3'、'5'] 的帖子。结果应该是 post1、post3 和 post4。如何编写一个 mongodb 查询来实现这一点?
听起来可能有更好的方法来实现您正在尝试做的事情,但是如果没有更多信息,很难提出高级建议。
这是一个查询,它将获得您要查找的内容:
{
$or:
[
{
tags:
{
$all: ['1', '3']
}
},
{
tags:
{
$all: ['3', '5']
}
},
{
tags:
{
$all: ['1', '5']
}
}
]
}
您会注意到它涉及列出您正在搜索的标签对的每个组合,因此它不能很好地扩展到更大的查询。
$all
编辑:通过使用而不是简化查询$and
。
如果要从 shell 执行此操作,可以使用 javascript。使用以下代码创建一个 javascopt 文件:
use test;
var initialArray = [1, 2, 3];
for (i = 0; i < initialArray.length; i++) {
for(j = initialArray.length-1; j>=i; j--) {
if(i!=j) {
var matchingArray = [initialArray[i].toString(), initialArray[j].toString()];
print("\nResults using array: " + matchingArray);
var result = db.posts.find({tags: {$all: matchingArray}});
while(result.hasNext()){
printjson(result.next());
}
}
}
}
并运行命令
C:\> mongo < query.js
注意:您可以对其进行优化以获得独特的结果。