- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 JSON
{
"responseCode": 200,
"productList": {
"count": 25,
"products": [
{
"id": 403492,
"description": null,
"plans": [
{
"name": "test1",
"type": "G"
},
{
"name": "test2",
"type": "Y"
}
]
}
],
}
}
我想获得仅类型“G”的计划,我不想将 test2 返回到 json我尝试使用 $elemMatch 但不起作用
Document query = new Document();
query.append("plans", new Document().append("$elemMatch", value));
最佳答案
很明显 $elemMatch(query) 是一种查询方法,当数组的元素与查询匹配时获取数据!
你想要的是$elemMatch(projection) !但根据official document,这个投影存在问题。 :
Both the $ operator and the $elemMatch operator project the first matching element from an array based on a condition.
这意味着您将只获得与查询匹配的第一个元素,所以也许它不符合您的需求!
有两种方法:
1-在应用程序端投影您想要的数据,也许使用 java Stream api!
2- 使用 $filter(aggregation)
第二种方式(java代码):
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.bson.conversions.Bson;
import java.util.Arrays;
import static com.mongodb.client.model.Aggregates.match;
import static com.mongodb.client.model.Aggregates.project;
import static com.mongodb.client.model.Filters.*;
public class Test {
public static void main(String[] args) throws Exception
{
MongoClient client = MongoClients.create(
"mongodb://localhost:27017"
);
MongoDatabase database = client.getDatabase("TEST");
MongoCollection<Document> documentMongoCollection =
database.getCollection("test");
Document document = documentMongoCollection.aggregate(
Arrays.asList(
match(elemMatch("productionList.products.plans" , eq("type" ,"G")))
,project(new Document("productionList.products" ,
map("productionList.products" , "this" ,
new Document("plans" ,
filter("$this.plans" ,
"plan" ,
new Document(
"$eq" ,
Arrays.asList("$$plan.type" , "G")
)))
.append("description" , "$$this.description")//make it present
.append("id" , "$$this.id"))) //make it present
.append("responseCode" , 1) //include
.append("productionList.count" , 1) //include
)
)).first();
System.out.println(document.toJson());
}
private final static Bson filter(String arrayName , String as , Bson cond)
{
//so to do it !
Document document = new Document("input" , "$"+arrayName);
if(as!=null && !as.isEmpty())
document.append("as" , as);
document.append("cond" , cond);
return new Document("$filter" , document);
}
private final static Bson map(String arrayName ,String as , Bson in)
{
Document document = new Document("input" , "$"+arrayName);
if(as!=null && !as.isEmpty())
document.append("as" , as);
document.append("in" , in);
return new Document("$map" , document);
}
}
也许很难理解我在这段代码上写的内容,您需要检查以下链接:
关于java - 使用 java 的嵌套数组的 $elemMatch 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60743947/
根据 mongodb 文档,$elemMatch 的语法是, t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } ) 我试过了,效果
我有以下文件 { "_id" : ObjectId("52da43cd6f0a61e8a5059aaf"), "assignments" : [ {
我正在为我的应用中的项目(产品)进行用户评分(赞/不赞)。 我似乎能够通过对象数组实现我想要的,但我想知道 mongodb 是否提供了一种方法来使用数字数组 (user_ids) 实现这一点。 db.
我有以下文件 { "_id" : ObjectId("52da43cd6f0a61e8a5059aaf"), "assignments" : [ {
我正在为我的应用中的项目(产品)进行用户评分(赞/不赞)。 我似乎能够通过对象数组实现我想要的,但我想知道 mongodb 是否提供了一种方法来使用数字数组 (user_ids) 实现这一点。 db.
这是我的对象: { "_id" : ObjectId("53fdcb6796cb9b9aa86f05b9"), "list" : [ "a", "b" ], "complist" : [ { "a"
我正在尝试查找与条件匹配的数组的最后一个元素,例如,如果我有来自 $elemMatch 的数据页: { _id: 1, students: [ { name: "john", scho
我有以下数据结构 { "_id" : ObjectId("523331359245b5a07b903ccc"), "a" : "a", "b" : [ {
我有一个 unitScores 集合,其中每个文档都有一个 id 和一个文档数组,如下所示: "_id": ObjectId("52134edd5b1c2bb503000001"), "scores"
我的 MongoDB 文档结构如下: {_id: ObjectId("53d760721423030c7e14266f"), fruit: 'apple', vitamins: [ {
考虑以下文档: { "_id" : "ID_01", "code" : ["001", "002", "003"], "Others" : "544554" } 我经历了这个MongoDB
所以,我有一个数据库,其中包含大量文档中的数组。我想使用 $in 找到我的查询与一个或多个数组元素完全匹配的整个文档。 所以,文档结构: { "_id": "76561198045636214",
查询运算符$and的用法有什么逻辑区别吗? db.collection.find({$and: [{"array.field1": "someValue"}, {"array.field2": 3}]
我知道您可以使用 $elemMatch 作为投影来限制子集合数组中的项目。当这样使用它时,它会返回匹配的子文档的所有字段,无论是否也指定了 query projections。 是否可以限制匹配子文档
我有一个像这样的集合(摘要)。 { "id":"summaryid", "locations": [ { "id": "loc1",
我有一个包含以下形式文档的集合: { "_id" : { "$oid" : "67bg............"}, "ID" : "xxxxxxxx", "senses"
我有一个像这样的集合(摘要)。 { "id":"summaryid", "locations": [ { "id": "loc1",
假设我有这样一个文档 { title : 'myTitle', favorites : [{name : 'text', number : 6}, {name : 'other', numbe
我的查询: { 'objects.item.opts1.opts2': { '$elemMatch': [ { name: 'false' } ] } } 返回:数组 opts2 中包含任何内容的任何
如何使用 elemMatch 对 SubDocument 数组进行搜索?我有一个名为 ReportCollection 的文档,其中包含以下元素:- /* 0 */ { "_id" : Obj
我是一名优秀的程序员,十分优秀!