如何查询MongoDB的嵌入式数组

Posted

技术标签:

【中文标题】如何查询MongoDB的嵌入式数组【英文标题】:How to query Mongodb for embedded array 【发布时间】:2016-10-26 16:10:16 【问题描述】:

我有一个类似 mongodb 的结构。

场所模型的结构

.....
  amenities: [
    
      name: "wifi",
      is_free: true
    ,
    
      name: "projector",
      is_free: false,
      price: "50"
    ,
    ...........
    ...........
    ...........
  ]
.....

我想查询哪里,我想搜索一个地方,该地方有一些便利设施,而与price & is_free 字段无关。如何在 mongodb / mongoose 查询中执行此操作。

我想要列出有 wifi 和 投影仪作为输出。

【问题讨论】:

你的问题不清楚。所以你已经尝试过和预期的结果。 你想找出那些有价格和is_free的便利设施 价格和 is_free 无关紧要。我想要有“wifi”和“投影仪”等便利设施的地方。 我已经修改了问题。请看一看。 @Shrabanee How to search in array of object in mongodb的可能重复 【参考方案1】:

尝试以下查询以获取name 的一个选项:

db.places.find(amenities: $exists: true, 'amenities.name':'wifi')

也可以试试这个查询,如果有多个选项来检查name:-

var findQuery = amenities: $exists: true, 'amenities.name':'wifi' , 'amenities.name':'projector'

db.places.find(findQuery);

希望这会对你有所帮助。

【讨论】:

它不能解决我的问题。请查看多个选项,它会导致一个空数组。甚至我的数据库也与查询匹配。 根据您的要求更新了查询。我认为您的问题不够清楚,无法让某人一口气帮助您。【参考方案2】:
db.places.find($and: ['amenities.name': 'wifi', 'amenities.name':'projector'])

它将找到在数组['wifi', 'projector'] 中指定了所有赦免的地方。

希望对你有帮助。

【讨论】:

不仅有便利设施。但它应该有特定的便利设施。你的回答不能解决我的问题 找到那些在数组中指定了所有功能的地方,例如:['wifi', 'loudspeakers', 'phone']。是你需要的吗? 是的!这就是我想要的。但是您的查询没有这样做。它将仅搜索已提交的便利设施是否存在。 @AkhilP,这个问题解释性不够。但是,我已经编辑了我的答案。如果有帮助,请看看。 我认为没有$and 也可以。只需使用两个条件两个find即可。【参考方案3】:

请尝试执行以下查询

db.places.find(
    amenities : 
        $exist : true
    ,
    amenities : 
        $elemMatch : 
            name : 
                $in : ['wifi', 'projector']
            
        
    
)

在上述查询中,$exists 运算符将检查文档中是否存在便利设施字段,$elemMatch 运算符将匹配包含具有以下值的名称字段的便利设施数组

(1) 无线网络

(2) 投影仪

【讨论】:

请记住,这将只返回第一个匹配的元素 elemMatch 特定的 :-) 返回的文件至少与$in : ['wifi', 'projector'] 中的一项设施相匹配。但我想要的文件必须同时拥有['wifi', 'projector']

以上是关于如何查询MongoDB的嵌入式数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDb 的嵌入式数组中查找多个元素

查询spring数据mongodb中嵌入文档的数组

MongoDB(12)- 查询嵌入文档的数组

MongoDB - 如何从集合中查询嵌入式文档

如何在 MongoDB 的嵌入式数组对象中插入 json 对象?

如何匹配 MongoDB 中嵌入式数组或文档中的字符串?