Android平台Couchbase Lite 1.4的MapReduce Views查询问题
Hey there! Let's break down how to set up a MapReduce view in Couchbase Lite 1.4 to get exactly the documents you need. I remember fumbling with this when I first started with Couchbase Lite, so I get where you're coming from.
Step 1: Create the MapReduce View
First, you need to define a view that indexes your documents based on both type and relatedObjectId. The map function will filter and emit a composite key that combines these two values—this is the key to efficiently querying for both conditions at once.
Here's the Android Java code to set up the view:
// Get or create the view (use a unique name for your use case) View myTypeView = database.getView("mytype_by_relatedobjectid"); // Set the map function with a version number (increment this if you ever update the logic!) myTypeView.setMap(new Mapper() { @Override public void map(Map<String, Object> document, Emitter emitter) { // First, check if the document is of the type we care about String docType = (String) document.get("type"); if ("mytype".equals(docType)) { // Extract the relatedObjectId to include in our composite key String relatedId = (String) document.get("relatedObjectId"); // Emit a composite key: [type, relatedObjectId] emitter.emit(new Object[]{docType, relatedId}, null); } } }, "1.0");
Step 2: Execute the Query
Once the view is set up, you can query it to fetch all documents where type is "mytype" and relatedObjectId matches your target value.
// Define your target relatedObjectId String targetRelatedId = "objectId_23445"; // Replace with your specific ID // Create a query from the view Query query = myTypeView.createQuery(); // Set the key to match our composite value query.setKey(new Object[]{"mytype", targetRelatedId}); // Run the query and process results try { QueryEnumerator result = query.run(); for (QueryRow row : result) { // Get the full document from the query row Document matchingDoc = row.getDocument(); // Access the document properties you need Long dateCreated = (Long) matchingDoc.getProperty("dateCreated"); String docRelatedId = (String) matchingDoc.getProperty("relatedObjectId"); // Do whatever you need with the document data here! } } catch (CouchbaseLiteException e) { e.printStackTrace(); // Handle any query errors here }
Key Explanations
- Composite Key: By emitting an array
[type, relatedObjectId]as the key, we create an index that groups documents first by type, then by relatedObjectId. This lets us directly target the exact subset of documents we want without extra filtering. - Reduce Function: You don't need a Reduce function here because you're fetching full documents, not aggregated data (like counts or sums). The default
nullvalue means the query returns the rows emitted by the map function, each pointing to a matching document. - Version Number: Always increment the version string in
setMapif you change the map logic. This tells Couchbase Lite to re-index all documents with the new function, ensuring your queries use up-to-date data.
Quick Tip
Add null checks for type and relatedObjectId in the map function if some documents might be missing these fields—this prevents unexpected NullPointerExceptions during indexing.
Hope this clears up how MapReduce views work for your use case! Let me know if you run into any snags with the code.
内容的提问来源于stack exchange,提问作者Sergei Yendiyarov

