我有一个包含子文档的集合,我试图找到一种简单的方法来获取确切的文档。
{
"_id" : ObjectId("59b0303bfe409a21fccc9523"),
"CreatedOn" : ISODate("2017-07-22T15:55:00.000+0000"),
"UpdatedOn" : ISODate("2017-07-22T15:55:00.000+0000"),
"Guid" : "4F1D7541-FF27-4FEF-9BC4-CF27D2CB92BA",
"Company" : "Demo Co.",
"Departments" : [
{
"CreatedOn" : ISODate("2017-07-22T15:55:00.000+0000"),
"UpdatedOn" : ISODate("2017-07-22T15:55:00.000+0000"),
"Guid" : "D5950FC8-91B1-48A3-8B6A-F3A72FAC9175",
"Title" : "Execute"
}
]
}
我想要做的是根据其指南获得某个部门,但到目前为止,我没有找到任何干净的东西来获得我想要的文件。
我想得到这样的结果:
{
"CreatedOn" : ISODate("2017-07-22T15:55:00.000+0000"),
"UpdatedOn" : ISODate("2017-07-22T15:55:00.000+0000"),
"Guid" : "D5950FC8-91B1-48A3-8B6A-F3A72FAC9175",
"Title" : "Execute"
}
我一直在寻找mongodb文档但到目前为止没有任何工作,我最接近的是使用array_search,但我想直接从mongo本身获取它,如果可能的话避免用PHP攻击它。
答案 0 :(得分:0)
也许是这样的:
db.collection.find( { "Departments.Guid": "some_value" } )
https://docs.mongodb.com/manual/tutorial/query-embedded-documents/
答案 1 :(得分:0)
假设GUID对Departments
数组中的subdoc是唯一的(即查找GUID只能在父文档中产生一个可能的匹配)但GUID可能与其他父文档相同,那么这会产生你寻求的输出结果。如果GUID在所有阵列和父文档中都是唯一的,那么这也是有用的。
基本上,我们过滤Departments.Guid
=目标GUID(下面是“myGUID”)。这给我们留下了一个0或1个元素的数组,我们用$arrayElemAt
从中提取子文件,然后将该文档作为根文档“提升”到位(而不是将文档分配给命名字段)。如果没有subdoc匹配(数组post-filter的长度为0),则$arrayElemAt
将产生null,qq
将不存在。我们希望在调用$replaceRoot
之前删除这些文档,这需要将现有字段提升到根目录中。
db.foo.aggregate([
{$project: { qq: {$arrayElemAt: [
{ $filter: {
input: "$Departments",
as: "zz",
cond: {$eq: [ "$$zz.Guid", "myGUID" ]}
}}
, 0] } }}
,{$match: { qq: {$exists: true}} }
,{$replaceRoot: { newRoot: "$qq"} }
]);
答案 2 :(得分:0)
你可以试试这个,
[
[
{
"CreatedOn" : ISODate("2017-07-22T21:25:00.000+05:30"),
"UpdatedOn" : ISODate("2017-07-22T21:25:00.000+05:30"),
"Guid" : "D5950FC8-91B1-48A3-8B6A-F3A72FAC9175",
"Title" : "Execute"
}
]
]
这只会返回:
angular.module('conFusion.services', ['ngResource'])
.constant("baseURL","http://localhost:3000/")
.service('menuFactory', ['$http', '$resource', 'baseURL', function($http, $resource,baseURL) {