如何使用同一字段中多个字段中具有两个或多个值不同的查找文档

时间:2019-05-20 21:21:27

标签: python mongodb pymongo

在集合供稿中,我需要过滤具有Ex:的文档:

{"type": "news"},
{"type": "media"},
{"type": "profile"},
{"category": "shoes"},
{"category": "dress"},
{"lang": "eng"}. 

此查找必须具有{"type": "media"}{"type": "profile"}的文档,但不能在同一文档中。

我已经尝试过

findOptions = {
            "type": "news",
            "type": "media", 
            "type": "profile", 
            "category": "shoes", 
            "category": "dress", 
            "lang": "eng"
        }

find = db.col.find(findOptions).limit(20)

但这只能找到最后type和最后category

我尝试使用$or$and

逻辑$and搜索具有两种类型的文档,但是没有两种或多种类型的文档,我只想搜索一种和另一种。

$or很好!如果我只放入三个types,它将搜索我想要的内容;但是,如果我也放入category,它将找不到任何内容!

如何搜索具有{"type": "news"}的文档以及如何找到具有{"type": "profile"}的文档?

1 个答案:

答案 0 :(得分:0)

您可以使用public class UndirectedGraph<A, V> { private int numEdges; private int numVertices; private Edge[] edgeList; private SeparateChainingHashST<String , Vertice> hash; public UndirectedGraph() { numEdges = 0; numVertices = 0; hash = new SeparateChainingHashST<>(); } public Vertice getVertice(String key) { return hash.get(key); } public Iterable<String> getVertices() { return hash.keys(); } public List<Vertice> getVerticesList() { Iterator<String> it = hash.keys().iterator(); ArrayList<Vertice> array = new ArrayList<>(); while (it.hasNext()) { String key = it.next(); array.add(hash.get(key)); } return array; } /** * Da el numero de vertices que tiene el grafo * @return numero de vertices */ public int V() { return numVertices; } /** * Da el numero de arcos que tiene el grafo * @return numero de arcos */ public int E() { return numEdges; } public Edge[] getEdges() { return edgeList; } public List<Edge> getEdgesList() { ArrayList<Edge> al = new ArrayList<>(); int i = 0; while (i < edgeList.length) { al.add(edgeList[i]); i++; } return al; } /** * Agrega un vertice nuevo el arco * @param key * @param vertice */ public void addVertice(String key, Vertice vertice ) { hash.put(key, vertice); numVertices++; } /** * Agrega un arco nuevo al grafo * @param id1 * @param id2 * @param info * @param cost */ public void addEdge(String id1, String id2, A info, float cost ) { Vertice<V> vertice1 = hash.get(id1); Vertice<V> vertice2 = hash.get(id2); Edge edge = new Edge(cost, info, vertice1, vertice2); edgeList[numEdges] = edge; numEdges++; } /** * Da la informacion del vertice dado * @param id * @return V */ public V getInfoVertex(String id ) { Vertice<V> vertex = hash.get(id); return vertex.getInfo(); } /** * Se cambia l ainformcion del vertice dado por la dada por parametro * @param idVertex * @param infoVertex */ public void setInfoVertex(String idVertex, V infoVertex){ Vertice<V> vertex = hash.get(idVertex); vertex.setInfo(infoVertex); } /** * Da la informacion del arco que se encuentra entre los dos arcos dados * @param id1 * @param id2 * @return Informacion del arco */ public A getInfoEdge(String id1, String id2 ) { A info = null; for (Edge edge : edgeList) { String idVertex1 = edge.getVertice1().getKey(); String idVertex2 = edge.getVertice2().getKey(); if( (idVertex1.equals(id1) && idVertex2.equals(id2)) || (idVertex1.equals(id2) && idVertex2.equals(id1)) ) { info = (A) edge.getInfo(); return info; } } return info; } /** * Cambia la informacion del arco que se encuentra entre los dos vertices dados * @param id1 * @param id2 * @param info */ public void setInfoEdge(String id1, String id2, A info ) { for (Edge edge : edgeList) { String idVertex1 = edge.getVertice1().getKey(); String idVertex2 = edge.getVertice2().getKey(); if( (idVertex1.equals(id1) && idVertex2.equals(id2)) || (idVertex1.equals(id2) && idVertex2.equals(id1)) ) { edge.setInfo(info); return; } } } /** * Retorna los identificadores de los vertices adyacentes al vertice dado por parametro * @param idVertex * @return Identificadores de los vertices adyacentes */ public Iterable<String> adj(String idVertex){ IQueue<String> queue = new Queue<>(); ArrayList<Vertice<V>> vertex = hash.get(idVertex).getAdj(); for (Vertice<V> vertice : vertex) { queue.enqueue(vertice.getKey()); } return queue; } }

$in