假设我们有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查询来实现这一点?
假设我们有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查询来实现这一点?
如果你想从shell中做到这一点,你可以使用JavaScript。用下面的代码创建一个javascropt文件:
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
注意:您可以对其进行优化来获得独特的效果。
你可以用一个相对简单的mongo查询来实现这个 –
是的,我看到了......但是如果你在给定的数组中添加一个或两个以上的元素,它会变得更加复杂,不是吗?无论如何,我认为我的答案只是更通用,但它是downvoting没有错。 – Schaliasos
是的,数据模式应该更好我猜:( –
听起来好像可能有更好的方法来实现你想要做的事情,但没有更多的信息,很难提出高层次的建议。
下面是一个查询,将让你在寻找什么:
{
$or:
[
{
tags:
{
$all: ['1', '3']
}
},
{
tags:
{
$all: ['3', '5']
}
},
{
tags:
{
$all: ['1', '5']
}
}
]
}
你会发现,它涉及到上市对您正在搜索标签的每个组合,因此它赢得了”吨扩展到更大的查询。
编辑:通过使用$all
而不是$and
来简化查询。
其实我想过这个,但不幸的是,列表的长度是多达25,我想匹配至少20%。 – ldsenow
@ldsenow这将是一件好事在你的问题中指出,也许如果你从更高的层次上了解你正在尝试的是什么,那么有人可以提供帮助,因为这是在Mongo查询中完成的最好方法。 –
有些要求不能在查询中实现。如果这是你的应用程序的一部分,我建议在其中添加功能,而不是试图为此创建查询。也许你可以在shell上用javascript实现它,但这也是编程。 – Schaliasos
可能的重复[如何检查数组字段是否是MongoDB中另一个数组的一部分?](http://stackoverflow.com/questions/15635658/how-to-check-if-an-array-field-is -a-part-of-another-array-in-mongodb) – WiredPrairie
@WiredPrairie它是相似的,但真的是我想要的。无论如何感谢 – ldsenow