简体   繁体   中英

Looping though all documents in the collection and an array in each document to match array value to the project

I have a MongoDB collection with the following structure:

/* 1 */
{
    "_id" : ObjectId("5cdb24b41a40ae58e6d690fd"),
    "versions" : [ 
        ObjectId("5cdb24b41a40ae58e6d690fe")
    ],
    "releases" : [],
    "monetization" : [],
    "owner" : "testuser",
    "name" : "test-repo-2",
    "repoAddress" : "/testuser/test-repo-2",
    "repoKey" : null,
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("5cdb23cb1a40ae58e6d690fa"),
    "versions" : [ 
        ObjectId("5cdb23cb1a40ae58e6d690fb"), 
        ObjectId("5cdda9c54e6d0b795a007960")
    ],
    "releases" : [ 
        ObjectId("5cdda9c54e6d0b795a00795c")
    ],
    "monetization" : [],
    "owner" : "testuser",
    "name" : "test-repo-1",
    "repoAddress" : "/testuser/test-repo-1",
    "repoKey" : null,
    "__v" : 2,
    "createdAt" : ISODate("2019-05-16T18:19:49.159Z"),
    "updatedAt" : ISODate("2019-05-16T18:19:49.252Z")
}

I need to loop though all the documents in the collection as well as they array of versions to look for a specific to match it to the project. I need to do this with NodeJS, but for now I'm trying it from mongoshell. I'm trying to use forEach() and $in operator to do this.

db.projects.find().forEach(
    function () {
        {
            versions: {
                $in: ['5cdb24b41a40ae58e6d690fe']
            }
        }
    }
);

But each time I get the following response: Script executed successfully, but there are no results to show. Am I doing this correctly?

There are various solutions you could try, for example:

1) You could add a filter to your find-query:

db.getCollection('debug').find({"versions":{"$in":[ObjectId("5cdb24b41a40ae58e6d690fe")]}})

This would directly return the object you're looking for.

2) If you don't want to pass a filter and really query all documents and filter them yourself, you could try the following:

db.getCollection('debug').find({}).forEach(doc => {

     doc.versions.forEach(v => {

         if(v.toString() === "ObjectId(\"5cdb24b41a40ae58e6d690fe\")") {
               print("match");
         }

     });        

});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM